Рефлексия PHP
Nette\Utils\Reflection – статический класс с полезными функциями для рефлексии PHP. Его назначение – устранить недостатки нативных классов рефлексии и унифицировать поведение в разных версиях PHP.
Установка:
composer require nette/utils
Во всех примерах предполагается, что определён такой псевдоним класса:
use Nette\Utils\Reflection;
areCommentsAvailable(): bool
Проверяет, есть ли у рефлексии доступ к комментариям PHPdoc. Комментарии могут быть недоступны из-за кеширования опкодов, см., например, директиву opcache.save-comments.
expandClassName (string $name, ReflectionClass $context): string
Разворачивает имя класса $name в полное имя в контексте класса
$context, учитывая его пространство имён и определённые псевдонимы.
По сути, он определяет, как парсер PHP истолковал бы $name, если бы
оно было написано внутри тела класса $context.
namespace Foo;
use Bar;
class DemoClass
{
// new Bar, new Baz
}
$context = new ReflectionClass(Foo\DemoClass::class);
Reflection::expandClassName('Bar', $context); // 'Bar'
Reflection::expandClassName('Baz', $context); // 'Foo\Baz'
getMethodDeclaringMethod (ReflectionMethod $method): ReflectionMethod
Возвращает рефлексию метода, содержащего настоящее объявление
$method. Обычно метод является собственным объявлением, но его тело
может происходить из трейта и, возможно, под другим именем.
Поскольку PHP не даёт достаточно сведений, чтобы надёжно определить настоящее объявление, Nette использует собственную эвристику, которая должна быть надёжной.
trait DemoTrait
{
function foo()
{
}
}
class DemoClass
{
use DemoTrait {
DemoTrait::foo as foo2;
}
}
$method = new ReflectionMethod('DemoClass::foo2');
Reflection::getMethodDeclaringMethod($method); // ReflectionMethod('DemoTrait::foo')
getParameterDefaultValue (\ReflectionParameter $param): mixed
Возвращает значение по умолчанию параметра функции или метода. В
отличие от нативного ReflectionParameter::getDefaultValue(), он правильно
разрешает и константы, в том числе константы классов, использованные
как значение по умолчанию. Если константу разрешить не удаётся,
выбрасывается \ReflectionException.
class DemoClass
{
const DefaultValue = 123;
}
function demo($param = DemoClass::DefaultValue)
{
}
$param = new ReflectionParameter('demo', 'param');
echo Reflection::getParameterDefaultValue($param); // 123
getPropertyDeclaringClass (ReflectionProperty $prop): ReflectionClass
Возвращает рефлексию класса или трейта, содержащего объявление
свойства $prop. Свойство может быть объявлено внутри трейта.
Поскольку PHP не даёт достаточно сведений, чтобы надёжно определить настоящее объявление, Nette использует собственную эвристику, которая не является полностью надёжной.
trait DemoTrait
{
public $foo;
}
class DemoClass
{
use DemoTrait;
}
$prop = new ReflectionProperty(DemoClass::class, 'foo');
Reflection::getPropertyDeclaringClass($prop); // ReflectionClass('DemoTrait')
getUseStatements (ReflectionClass $class): array
Возвращает массив конструкций use (псевдонимов) из файла, в котором
определён класс $class. Ключи – псевдонимы, значения – полные
имена классов. Требует расширение PHP tokenizer.
namespace Foo;
use Nette\Utils\Strings;
use Nette\Utils\Arrays as Arr;
class DemoClass
{
}
$class = new ReflectionClass(Foo\DemoClass::class);
Reflection::getUseStatements($class);
// ['Strings' => 'Nette\Utils\Strings', 'Arr' => 'Nette\Utils\Arrays']
isBuiltinType (string $type): bool
Проверяет, является ли $type встроенным типом PHP. Иначе он
считается именем класса.
Reflection::isBuiltinType('string'); // true
Reflection::isBuiltinType('Foo'); // false
Используйте Nette\Utils\Validators::isBuiltinType().
toString ($reflection): string
Преобразует объект рефлексии в удобочитаемую строку.
$func = new ReflectionFunction('func');
echo Reflection::toString($func); // 'func()'
$class = new ReflectionClass('DemoClass');
echo Reflection::toString($class); // 'DemoClass'
$method = new ReflectionMethod('DemoClass', 'foo');
echo Reflection::toString($method); // 'DemoClass::foo()'
$param = new ReflectionParameter(['DemoClass', 'foo'], 'param');
echo Reflection::toString($param); // '$param in DemoClass::foo()'
$prop = new ReflectionProperty('DemoClass', 'foo');
echo Reflection::toString($prop); // 'DemoClass::$foo'