#php #namespaces
#php #пространства имен
Вопрос:
Как я могу заставить это работать?
<?php
namespace Target {
class FooBar {
}
}
namespace Test {
use TargetFooBar;
$class = 'FooBar';
var_dump(new ReflectionClass(new $class));
}
На данный момент это не удается, потому что класс отражения находит только классы с полным пространством имен. Как я могу изменить это, чтобы он получал класс из инструкций use? Если есть функция, которую я пропускаю. Попытка таких вещей, как $class::class
also, просто приводит к ошибке.
Моя цель — иметь возможность работать с аннотациями для массивов, например:
<?php
namespace Target {
use FooBar;
class FooBar {
/**
* @var Bar[]|null
*/
public ?array $foo;
}
}
Возможно, то, что я делаю, невозможно, и я должен просто указать полное имя класса в аннотациях.
Я работаю с PHP7.4
Комментарии:
1.
$class = FooBar::class
должно работать в паре сnew ReflectionClass(new $class)
. Или я неправильно понял вопрос?2.
use
Операторы являются синтаксическими сокращениями. В скомпилированном коде они не существуют, и имена классов являются полными.
Ответ №1:
Боюсь, это невозможно. Согласно документации PHP, в имени динамического класса должно использоваться полное имя класса.
Необходимо использовать полное имя (имя класса с префиксом пространства имен). Обратите внимание, что, поскольку нет разницы между полным и полным именем внутри динамического имени класса, имени функции или имени константы, начальная обратная косая черта не требуется.
<?php
namespace Target {
class FooBar
{
}
}
namespace Test {
$class = 'TargetFooBar';
var_dump(new ReflectionClass(new $class));
}
В качестве альтернативы, есть возможность анализировать инструкции use и извлекать оттуда полное имя класса, хотя этот способ немного сложен.
github.com/Kdyby/ParseUseStatements
Комментарии:
1. Я обнаружил, что с тех пор это возможно, но только с помощью дополнительного фрагмента кода для анализа инструкций use исходного файла, как это делает эта библиотека github.com/Kdyby/ParseUseStatements
2. О, по-видимому, это возможно, да. Но это очень, очень хакерский способ. Конечно, это вариант, если его невозможно избежать. Спасибо за обновление.