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