Generador de código PHP
- Soporta todas las últimas características de PHP (como ganchos de propiedades, enums, atributos, etc.)
- Le permite modificar fácilmente las clases existentes
- Salida conforme con el estilo de codificación PSR-12 / PER
- Biblioteca madura, estable y ampliamente utilizada
Instalación
Descargue e instale el paquete utilizando Composer:
Para la compatibilidad con PHP, consulte la tabla.
Clases
Empecemos con un ejemplo sencillo de generación de clases utilizando ClassType:
Dará este resultado:
También podemos utilizar una impresora para generar el código, que, a diferencia de echo $class
, podremos configurar posteriormente:
Podemos añadir constantes (clase Constant) y propiedades (clase Property):
Genera:
Y podemos añadir métodos:
Resulta en:
Los parámetros promocionados introducidos por PHP 8.0 pueden pasarse al constructor:
Esto resulta en:
Las propiedades y clases de sólo lectura pueden marcarse a través de setReadOnly()
.
Si la propiedad, constante, método o parámetro añadido ya existe, lanza una excepción.
Los miembros pueden eliminarse utilizando removeProperty()
, removeConstant()
,
removeMethod()
o removeParameter()
.
También puede añadir objetos existentes Method
, Property
o Constant
a la clase:
Puede clonar métodos, propiedades y constantes existentes con un nombre diferente utilizando cloneWithName()
:
Interfaz o Trait
Puede crear interfaces y traits (clases InterfaceType y TraitType):
Utilizar rasgos:
Resultado:
Enums
Puedes crear fácilmente los enums que trae PHP 8.1 (clase EnumType):
Resultado:
También puede definir equivalentes escalares para los casos para crear un enum respaldado:
Es posible añadir un comentario o atributos a cada caso utilizando addComment()
o
addAttribute()
.
Clase anónima
Dale null
como nombre y tendrás una clase anónima:
Resultado:
Función global
El código de las funciones generará la clase GlobalFunction:
Resultado:
Cierre
El código de cierres generará la clase Closure:
Resultado:
Función Flecha
También puede imprimir el cierre como función de flecha utilizando la impresora:
Resultado:
Firma de método y función
Los métodos están representados por la clase Method. Se puede establecer la visibilidad, el valor de retorno, añadir comentarios, atributos, etc:
Cada parámetro está representado por una clase Parámetro. Una vez más, puede establecer todas las propiedades imaginables:
Para definir los llamados parámetros variádicos (o también el operador splat, spread, ellipsis, unpacking o tres puntos),
utilice setVariadic()
:
Genera:
Método y cuerpo de la función
El cuerpo puede pasarse al método setBody()
de una vez o secuencialmente (línea por línea) llamando
repetidamente a addBody()
:
Resultado
Puede utilizar marcadores de posición especiales para inyectar variables de forma práctica.
Marcadores de posición simples ?
Resultado:
Marcador de posición variable ...?
Resultado:
También puede utilizar PHP 8 parámetros con nombre utilizando marcador de posición ...?:
Escapar el marcador de posición usando la barra \?
Resultado:
Impresoras y cumplimiento del PSR
La clase Printer se utiliza para generar código PHP:
Puede generar código para todos los demás elementos, ofreciendo métodos como printFunction()
,
printNamespace()
, etc.
Además, está disponible la clase PsrPrinter
, cuya salida se ajusta al estilo de codificación PSR-2 / PSR-12
/ PER:
¿Necesitas ajustar el comportamiento a tus necesidades? Cree su propia impresora heredando de la clase Printer
.
Puedes reconfigurar estas variables:
¿Cómo y por qué difieren exactamente el estándar Printer
y PsrPrinter
? ¿Por qué no hay sólo
una impresora, la PsrPrinter
, en el paquete?
El estándar Printer
formatea el código tal y 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ó los estándares a tiempo, sino a veces incluso con varios años de
retraso desde la introducción de una nueva característica en PHP, esto dio lugar a algunas pequeñas diferencias en el estándar de codificación. La mayor diferencia es simplemente el uso
de tabuladores en lugar de espacios. Sabemos que utilizando tabuladores en nuestros proyectos permitimos ajustar la anchura, lo
que es esencial para las personas con
deficiencias visuales. Un ejemplo de diferencia menor es la colocación de la llave rizada en una línea separada para
funciones y métodos y siempre. Consideramos que la recomendación del PSR es ilógica y conduce a una disminución de la claridad del
código.
Tipos
Cada tipo o tipo de unión/intersección puede pasarse como una cadena, también puede utilizar constantes predefinidas para tipos nativos:
Lo mismo se aplica al método setReturnType()
.
Literales
Con Literal
puede pasar código PHP arbitrario a, por ejemplo, valores predeterminados de propiedades
o parámetros, etc:
Resultado:
También puede pasar parámetros a Literal
y hacer que se formatee en código PHP válido utilizando marcadores de posición especiales:
El literal que representa la creación de un nuevo objeto se genera fácilmente mediante el método new
:
Atributos
Puede agregar atributos PHP 8 a todas las clases, métodos, propiedades, constantes, casos enum, funciones, cierres y parámetros. Los literales también pueden ser usados como valores de parámetros.
Resultado:
Ganchos para propiedades
También puede definir ganchos de propiedad (representados por la clase PropertyHook) para operaciones get y set, una característica introducida en PHP 8.4:
Esto genera:
Las propiedades y los ganchos de propiedades pueden ser abstractos o finales:
Visibilidad asimétrica
PHP 8.4 introduce visibilidad asimétrica para las propiedades. Puede establecer diferentes niveles de acceso para lectura y escritura.
La visibilidad puede establecerse 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 obtener o establecer la propiedad. El modo por defecto es 'get'
.
Esto genera:
Espacio de nombres
Las clases, traits, interfaces y enums (en adelante clases) pueden agruparse en espacios de nombres (PhpNamespace):
Si la clase ya existe, lanza excepción.
Puede definir declaraciones de uso:
Para simplificar un nombre completo de clase, función o constante según los alias definidos, utilice el método
simplifyName
:
A la inversa, puede convertir un nombre de clase, función o constante simplificado en uno totalmente cualificado utilizando
el método resolveName
:
Resolución de nombres de clase
Cuando una clase es parte de un espacio de nombres, se renderiza de forma ligeramente diferente: todos los tipos (por ejemplo, sugerencias de tipo, tipos de retorno, nombre de la clase padre, interfaces implementadas, rasgos usados y atributos) se resuelven automáticamente (a menos que lo desactives, ver más abajo). Esto significa que debes usar nombres de clase completamente cualificados en las definiciones, y serán reemplazados por alias (basados en cláusulas de uso) o nombres completamente cualificados 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 pueden agruparse en archivos PHP representados por la clase PhpFile:
Resultado:
Por favor, tenga en cuenta: No se puede añadir código adicional a los archivos fuera de las funciones y clases.
Generar en función de los existentes
Además de poder modelar clases y funciones utilizando la API descrita anteriormente, también puede hacer que se generen automáticamente utilizando las existentes:
Los cuerpos de las funciones y métodos están vacíos por defecto. Si quieres cargarlos también, utiliza esta forma (requiere
que nikic/php-parser
esté instalado):
Carga desde archivo PHP
También puede cargar funciones, clases, interfaces y enums directamente desde una cadena de código PHP. Por ejemplo, creamos
el objeto ClassType
de esta manera:
Cuando se cargan clases desde código PHP, se ignoran los comentarios de una sola línea fuera de los cuerpos de los métodos (por ejemplo, para propiedades, etc.) porque esta biblioteca no tiene una API para trabajar con ellos.
También puede cargar directamente el archivo PHP completo, que puede contener cualquier número de clases, funciones o incluso múltiples espacios de nombres:
También se cargan el comentario inicial del archivo y la declaración strict_types
. En cambio, el resto del
código global se ignora.
Esto requiere que nikic/php-parser
esté instalado.
Si necesita manipular código global en archivos o sentencias individuales en cuerpos de métodos, es mejor
utilizar directamente la biblioteca nikic/php-parser
.
Manipulador de clases
La clase ClassManipulator proporciona herramientas para manipular clases.
El método inheritMethod()
copia un método de una clase padre o de una interfaz implementada en su clase. Esto
le permite sobrescribir el método o extender su firma:
El método inheritProperty()
copia una propiedad de una clase padre en tu clase. Esto es útil cuando se desea
tener la misma propiedad en su clase, pero posiblemente 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:
Volquete de variables
El Dumper devuelve una representación de cadena PHP parseable de una variable. Proporciona una salida mejor y más clara que
la función nativa var_export()
.
Tabla de compatibilidad
PhpGenerator 4.1 es compatible con PHP 8.0 a 8.4.