Рефлексия 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'
версия: 4.x