Reflectarea PHP
Nette\Utils\Reflection este o clasă statică cu funcții utile pentru reflecția PHP. Scopul său este de a corecta defectele din clasele native și de a unifica comportamentul în diferite versiuni ale PHP.
Instalare:
composer require nette/utils
Toate exemplele presupun că este definit următorul alias de clasă:
use Nette\Utils\Reflection;
areCommentsAvailable(): bool
Află dacă reflecția are acces la comentariile PHPdoc. Este posibil ca comentariile să nu fie disponibile din cauza cache-ului opcode, a se vedea, de exemplu, directiva opcache.save-comments.
expandClassName(string $name, ReflectionClass $context): string
Extinde $name
a clasei la numele complet în contextul $context
, adică în contextul spațiului său
de nume și al aliasurilor definite. Astfel, returnează modul în care parserul PHP ar înțelege $name
dacă ar fi
scris în corpul $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
Returnează o reflectare a unei metode care conține o declarație $method
. De obicei, fiecare metodă este
o declarație proprie, dar corpul metodei poate fi, de asemenea, în trăsătură și sub un nume diferit.
Deoarece PHP nu oferă suficiente informații pentru a determina declarația reală, Nette utilizează propria euristică, care ar trebui să fie fiabilă.
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
Returnează o reflectare a unei clase sau trăsături care conține o declarație a proprietății $prop
.
Proprietatea poate fi, de asemenea, declarată în trăsătură.
Deoarece PHP nu oferă suficiente informații pentru a determina declarația reală, Nette utilizează propriile euristici, care nu sunt fiabile.
trait DemoTrait
{
public $foo;
}
class DemoClass
{
use DemoTrait;
}
$prop = new ReflectionProperty(DemoClass::class, 'foo');
Reflection::getPropertyDeclaringClass($prop); // ReflectionClass('DemoTrait')
isBuiltinType(string $type): bool
Determină dacă $type
este un tip încorporat în PHP. În caz contrar, este numele clasei.
Reflection::isBuiltinType('string'); // true
Reflection::isBuiltinType('Foo'); // false
Utilizați Nette\Utils\Validator::isBuiltinType().
toString($reflection): string
Convertește o reflecție într-un șir de caractere lizibil pentru oameni.
$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'