Reflexión PHP
Nette\Utils\Reflection es una clase estática con funciones útiles para PHP reflection. Su propósito es arreglar fallas en clases nativas y unificar el comportamiento a través de diferentes versiones de PHP.
Instalación:
composer require nette/utils
Todos los ejemplos asumen que el siguiente alias de clase está definido:
use Nette\Utils\Reflection;
areCommentsAvailable(): bool
Averigua si reflection tiene acceso a los comentarios de PHPdoc. Los comentarios pueden no estar disponibles debido a la caché de opcode, véase por ejemplo la directiva opcache.save-comments.
expandClassName(string $name, ReflectionClass $context): string
Expande el $name
de la clase a nombre completo en el contexto del $context
, es decir, en el contexto
de su espacio de nombres y alias definidos. Así, devuelve cómo el analizador sintáctico de PHP entendería $name
si estuviera escrito en el cuerpo de $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
Devuelve una reflexión de un método que contiene una declaración de $method
. Normalmente, cada método es su
propia declaración, pero el cuerpo del método también puede estar en el trait y bajo un nombre diferente.
Debido a que PHP no proporciona suficiente información para determinar la declaración real, Nette usa su propia heurística, la cual debería ser confiable.
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
Devuelve un reflejo de una clase o trait que contiene una declaración de propiedad $prop
. La propiedad también
puede ser declarada en el trait.
Debido a que PHP no proporciona suficiente información para determinar la declaración real, Nette usa su propia heurística, la cual no es confiable.
trait DemoTrait
{
public $foo;
}
class DemoClass
{
use DemoTrait;
}
$prop = new ReflectionProperty(DemoClass::class, 'foo');
Reflection::getPropertyDeclaringClass($prop); // ReflectionClass('DemoTrait')
toString($reflection): string
Convierte una reflexión en una cadena legible por humanos.
$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'