Generador de código PHP
- Admite todas las características más recientes de PHP (como property hooks, enums, atributos, etc.)
- Le permite modificar fácilmente clases existentes
- El código de salida cumple con el estilo de codificación PSR-12 / PER
- Biblioteca madura, estable y ampliamente utilizada
Instalación
Descargue e instale la biblioteca usando Composer:
Puede encontrar la compatibilidad con PHP en la tabla.
Clases
Comencemos directamente con un ejemplo de creación de una clase usando ClassType:
Devuelve el siguiente resultado:
También podemos usar el llamado printer para generar el código, que a diferencia de echo $class
, podremos configurar más:
Podemos agregar constantes (clase Constant) y propiedades (clase Property):
Genera:
Y podemos agregar métodos:
El resultado es:
Los parámetros promocionados introducidos en PHP 8.0 se pueden pasar al constructor:
El resultado es:
Las propiedades y clases de solo lectura se pueden marcar usando la función setReadOnly()
.
Si la propiedad, constante, método o parámetro agregado ya existe, se lanza una excepción.
Los miembros de la clase se pueden eliminar usando removeProperty()
, removeConstant()
,
removeMethod()
o removeParameter()
.
También puede agregar objetos Method
, Property
o Constant
existentes a la clase:
También puede clonar métodos, propiedades y constantes existentes con un nombre diferente usando
cloneWithName()
:
Interfaz o trait
Puede crear interfaces y traits (clases InterfaceType y TraitType):
Uso de traits:
Resultado:
Enums
Los enums, introducidos en PHP 8.1, se pueden crear fácilmente así: (clase EnumType):
Resultado:
También puede definir equivalentes escalares y crear así un enum “backed”:
A cada case se le puede agregar un comentario o atributos usando
addComment()
o addAttribute()
.
Clases anónimas
Pasamos null
como nombre y tenemos una clase anónima:
Resultado:
Funciones globales
El código de las funciones lo genera la clase GlobalFunction:
Resultado:
Funciones anónimas
El código de las funciones anónimas lo genera la clase Closure:
Resultado:
Funciones flecha abreviadas
También puede imprimir una función anónima abreviada usando el printer:
Resultado:
Firmas de métodos y funciones
Los métodos los representa la clase Method. Puede establecer la visibilidad, el tipo de retorno, agregar comentarios, atributos, etc:
Los parámetros individuales los representa la clase Parameter. Nuevamente, puede establecer todas las propiedades imaginables:
Para definir los llamados parámetros variádicos (o también operador splat) sirve setVariadic()
:
Genera:
Cuerpos de métodos y funciones
El cuerpo se puede pasar de una vez al método setBody()
o gradualmente (línea por línea) llamando
repetidamente a addBody()
:
Resultado
Puede usar placeholders especiales para insertar variables fácilmente.
Placeholders simples ?
Resultado
Placeholder para variadic ...?
Resultado:
También puede usar parámetros con nombre para PHP 8 usando ...?:
El placeholder se escapa con una barra invertida \?
Resultado:
Printer y conformidad con PSR
Para generar código PHP sirve la clase Printer:
Puede generar código de todos los demás elementos, ofrece métodos como printFunction()
,
printNamespace()
, etc.
También está disponible la clase PsrPrinter
, cuya salida cumple con el estilo de codificación PSR-2 / PSR-12
/ PER:
¿Necesita ajustar el comportamiento a medida? Cree su propia versión heredando la clase Printer
. Se pueden
reconfigurar estas variables:
¿Cómo y por qué difieren realmente el Printer
estándar y el PsrPrinter
? ¿Por qué no hay solo un
printer en el paquete, es decir, PsrPrinter
?
El Printer
estándar formatea el código como lo hacemos en todo Nette. Dado que Nette se creó mucho antes que
PSR, y también porque PSR durante muchos años no entregó estándares a tiempo, sino tal vez con varios años de retraso desde
la introducción de una nueva característica en PHP, sucedió que el estándar de codificación difiere en algunos pequeños detalles.
La mayor diferencia es solo el uso de tabuladores en lugar de espacios. Sabemos que al usar tabuladores en nuestros proyectos,
permitimos la personalización del ancho, lo cual es necesario para personas con
discapacidad visual. Un ejemplo de una pequeña diferencia es la colocación de la llave de apertura en una línea separada
para funciones y métodos, y siempre. La recomendación de PSR nos parece ilógica y conduce a una reducción de la claridad del código.
Tipos
Cada tipo o tipo unión/intersección se puede pasar como una cadena, también puede usar constantes predefinidas para tipos nativos:
Lo mismo se aplica al método setReturnType()
.
Literales
Con Literal
puede pasar cualquier código PHP, por ejemplo, para valores predeterminados de propiedades
o parámetros, etc:
Resultado:
También puede pasar parámetros a Literal
y dejar que se formateen en código PHP válido usando placeholders:
Un literal que representa la creación de un nuevo objeto se puede generar fácilmente usando el método new
:
Atributos
Los atributos de PHP 8 se pueden agregar a todas las clases, métodos, propiedades, constantes, enums, funciones, closures y parámetros. También se pueden usar literales como valores de parámetros.
Resultado:
Property Hooks
Con los property hooks (representados por la clase PropertyHook) puede definir operaciones get y set para propiedades, una característica introducida en PHP 8.4:
Genera:
Las propiedades y los property hooks pueden ser abstractos o finales:
Visibilidad asimétrica
PHP 8.4 introduce la visibilidad asimétrica para propiedades. Puede establecer diferentes niveles de acceso para lectura y escritura.
La visibilidad se puede establecer ya sea usando el método setVisibility()
con dos parámetros, o usando
setPublic()
, setProtected()
o setPrivate()
con el parámetro mode
, que
especifica si la visibilidad se aplica a la lectura o escritura de la propiedad. El modo predeterminado es
'get'
.
Genera:
Espacio de nombres
Las clases, propiedades, interfaces y enums (en adelante, clases) se pueden agrupar en espacios de nombres representados por la clase PhpNamespace:
Si la clase ya existe, se lanza una excepción.
Puede definir cláusulas use:
Para simplificar el nombre completamente calificado de una clase, función o constante según los alias definidos, use el
método simplifyName
:
Por el contrario, puede convertir el nombre simplificado de una clase, función o constante a su nombre completamente
calificado usando el método resolveName
:
Resolución de nombres de clases
Cuando una clase forma parte de un espacio de nombres, se renderiza de forma ligeramente diferente: todos los tipos (por ejemplo, typehints, tipos de retorno, nombre de la clase padre, interfaces implementadas, propiedades usadas y atributos) se resuelven automáticamente (a menos que lo desactive, ver más abajo). Esto significa que debe usar nombres de clase completos en las definiciones y se reemplazarán por alias (según las cláusulas use) o por nombres completamente calificados en el código resultante:
Resultado:
La resolución automática se puede desactivar de esta manera:
Archivos PHP
Las clases, funciones y espacios de nombres se pueden agrupar en archivos PHP representados por la clase PhpFile:
Resultado:
Advertencia: No es posible agregar ningún otro código fuera de funciones y clases a los archivos.
Generación a partir de existentes
Además de poder modelar clases y funciones usando la API descrita anteriormente, también puede hacer que se generen automáticamente a partir de patrones existentes:
Los cuerpos de funciones y métodos están vacíos de forma predeterminada. Si también desea cargarlos, use este método
(requiere la instalación del paquete nikic/php-parser
):
Carga desde archivos PHP
También puede cargar funciones, clases, interfaces y enums directamente desde una cadena que contenga código PHP. Por
ejemplo, así creamos un objeto ClassType
:
Al cargar clases desde código PHP, los comentarios de una sola línea fuera de los cuerpos de los métodos se ignoran (por ejemplo, en propiedades, etc.), ya que esta biblioteca no tiene una API para trabajar con ellos.
También puede cargar directamente un archivo PHP completo, que puede contener cualquier número de clases, funciones o incluso espacios de nombres:
También se cargan el comentario introductorio del archivo y la declaración strict_types
. Por el contrario, todo
el demás código global se ignora.
Se requiere que esté instalado nikic/php-parser
.
Si necesita manipular código global en archivos o sentencias individuales en cuerpos de métodos, es mejor usar
directamente la biblioteca nikic/php-parser
.
Class Manipulator
La clase ClassManipulator proporciona herramientas para manipular clases.
El método inheritMethod()
copia un método de la clase padre o interfaz implementada a su clase. Esto le permite
sobrescribir el método o extender su firma:
El método inheritProperty()
copia una propiedad de la clase padre a su clase. Es útil cuando desea tener la
misma propiedad en su clase, pero quizás con un valor predeterminado diferente:
El método implement()
implementa automáticamente todos los métodos y propiedades de la interfaz o clase
abstracta dada en su clase:
Volcado de variables
La clase Dumper
convierte una variable en código PHP analizable. Proporciona una salida mejor y más clara que la
función estándar var_export()
.
Tabla de compatibilidad
PhpGenerator 4.1 es compatible con PHP 8.0 a 8.4.