Reflexión de PHP
Nette\Utils\Reflection es una clase estática con funciones útiles para la reflexión de PHP. Su tarea es corregir las deficiencias de las clases nativas y unificar el comportamiento en diferentes versiones de PHP.
Instalación:
composer require nette/utils
Todos los ejemplos asumen que se ha creado un alias:
use Nette\Utils\Reflection;
areCommentsAvailable(): bool
Comprueba si la reflexión tiene acceso a los comentarios de PHPdoc. Los comentarios pueden no estar disponibles debido a la caché de opcode, ver, por ejemplo, la directiva opcache.save-comments.
expandClassName (string $name, ReflectionClass $context): string
Expande el nombre de la clase $name
a su nombre completo en el contexto de la clase $context
, es
decir, en el contexto de su espacio de nombres y alias definidos. Básicamente, dice cómo el analizador de PHP entendería
$name
si estuviera escrito en el cuerpo de la clase $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 la reflexión del método que contiene la declaración del método $method
. Normalmente, cada método es
su propia declaración, pero el cuerpo del método también puede estar en un trait y bajo un nombre diferente.
Dado que PHP no proporciona suficiente información para determinar la declaración real, Nette utiliza su propia heurística, que debería ser fiable.
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 la reflexión de la clase o trait que contiene la declaración de la propiedad $prop
. La propiedad
también puede declararse en un trait.
Dado que PHP no proporciona suficiente información para determinar la declaración real, Nette utiliza su propia heurística, que no es fiable.
trait DemoTrait
{
public $foo;
}
class DemoClass
{
use DemoTrait;
}
$prop = new ReflectionProperty(DemoClass::class, 'foo');
Reflection::getPropertyDeclaringClass($prop); // ReflectionClass('DemoTrait')
isBuiltinType (string $type): bool
Comprueba si $type
es un tipo incorporado de PHP. De lo contrario, es un nombre de clase.
Reflection::isBuiltinType('string'); // true
Reflection::isBuiltinType('Foo'); // false
Use Nette\Utils\Validator::isBuiltinType().
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'