Introducción a la API de reflexión de PHP

Hola Habr! Les presento la traducción del artículo " Introducción a la API de reflexión de PHP " de Mustafa Magdi .

Cómo analizar la estructura de datos en PHP




Entrada


Cuando comencé a programar en PHP, no sabía sobre las capacidades de la API Reflection . La razón principal es que no necesitaba diseñar mis clases simples, módulos o incluso paquetes. Luego descubrí que esto juega un papel importante en muchas áreas. En el artículo, consideraremos la API Reflection en los siguientes puntos:

  1. ¿Qué es la API de Reflection ?
  2. Instalación y configuración
  3. Uso
  4. Conclusión
  5. Recomendaciones


1. ¿Qué es la API Reflection?


En informática, reflexión o reflexión (el holónimo de introspección, reflexión en inglés) significa un proceso durante el cual un programa puede rastrear y modificar su propia estructura y comportamiento en tiempo de ejecución. - Wikipedia .
¿Qué significa la capacidad de detenerse y mirar dentro de su código ( ingeniería inversa )? Veamos el siguiente fragmento de código:

/** * Class Profile */ class Profile { /** * @return string */ public function getUserName(): string { return 'Foo'; } } 

La clase de perfil es un cuadro negro. Usando la API de Reflection puedes leer lo que hay dentro:

 //  $reflectionClass = new ReflectionClass('Profile'); //    var_dump($reflectionClass->getName()); => output: string(7) "Profile" //    var_dump($reflectionClass->getDocComment()); => output: string(24) "/** * Class Profile */" 

Por lo tanto, ReflectionClass actúa como analista de nuestra clase Profile , y esta es la idea principal de la API Reflection .

PHP te da la clave de cualquier casilla bloqueada, así que tenemos las claves
para lo siguiente:
ReflectionClass : informa información de la clase.
ReflectionFunction : informa la información de la función.
ReflectionParameter : recupera información sobre los parámetros de una función o método.
ReflectionClassConstant : informa información constante de la clase.

Puedes estudiar la lista completa en php.net

2. Instalación y configuración


Para usar las clases de Reflection API , no es necesario instalar ni configurar nada, ya que son parte del núcleo de PHP.

3. Ejemplos de uso


Los siguientes son algunos ejemplos de cómo podemos usar la API de Reflection :

Ejemplo 1:
Obtenga la clase principal para una clase específica:

 //   class Child extends Profile { } $class = new ReflectionClass('Child'); //     print_r($class->getParentClass()); // ['Profile'] 

Ejemplo 2
Obtenga la documentación para el método getUserName() :

 $method = new ReflectionMethod('Profile', 'getUserName'); var_dump($method->getDocComment()); => output: string(33) "/** * @return string */" 

Ejemplo 3
Se puede usar como instanceOf e is_a() para validar objetos:

 $class = new ReflectionClass('Profile'); $obj = new Profile(); var_dump($class->isInstance($obj)); // bool(true) //    var_dump(is_a($obj, 'Profile')); // bool(true) //    var_dump($obj instanceof Profile); // bool(true) 

Ejemplo 4
En algunas situaciones, puede estar atascado con las pruebas unitarias y preguntarse: "¿Cómo puedo probar una función privada?"

No te preocupes, aquí está el truco:

 //    getName() private function getName(): string { return 'Foo'; } $method = new ReflectionMethod('Profile', 'getUserName'); //          if ($method->isPrivate()) { $method->setAccessible(true); } echo $method->invoke(new Profile()); // Foo 

Los ejemplos anteriores son bastante simples, pero hay otros ejemplos en los que puede ver cómo se usa más ampliamente la API de Reflection :
  • Generador de documentación API : el paquete lavarel-apidoc-generator utiliza ampliamente ReflectionClass y ReflrectionMethod para obtener y posteriormente procesar información sobre bloques de documentación para clases y métodos, y para diseñar estos bloques de código.
  • Contenedor de inyección de dependencia : puede consultar el tema completo aquí

4. Conclusión


PHP proporciona una API Reflection completa que lo ayuda a llegar fácilmente a diferentes áreas de las estructuras de OOP.

5. Referencias



Del traductor:

También puede ver un ejemplo del uso de la API Reflection en el paquete Codeception en la clase Stub .
Esta clase a través de la reflexión ayuda a sumergir métodos y propiedades en pruebas unitarias.

Debe agregarse que la API Reflection funciona bastante lento, por lo que no debe involucrarse demasiado. Se recomienda su uso en pruebas o durante la depuración, pero si puede prescindir de ella, es mejor hacerlo. Y categóricamente no se recomienda su uso en el código de trabajo del proyecto, ya que Tampoco es seguro.

Source: https://habr.com/ru/post/es433266/


All Articles