Отражение на 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')
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')
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'