Générateur de code PHP
- Prend en charge toutes les dernières fonctionnalités de PHP (comme les crochets de propriété, les enums, les attributs, etc.)
- Vous permet de modifier facilement les classes existantes
- Sortie conforme au style de codage PSR-12 / PER
- Bibliothèque mature, stable et largement utilisée
Installation
Téléchargez et installez le paquet en utilisant Composer:
Pour la compatibilité avec PHP, voir le tableau.
Classes
Commençons par un exemple simple de génération de classe à l'aide de ClassType:
Cela donnera le résultat suivant :
Nous pouvons également utiliser une imprimante pour générer le code, qui, contrairement à echo $class
, pourra
être configuré ultérieurement:
Nous pouvons ajouter des constantes (classe Constant) et des propriétés (classe Property) :
Il génère :
Et on peut ajouter des méthodes:
Il en résulte :
Les paramètres promus introduits par PHP 8.0 peuvent être passés au constructeur :
Il en résulte :
Les propriétés et les classes en lecture seule peuvent être marquées via setReadOnly()
.
Si la propriété, la constante, la méthode ou le paramètre ajouté existe déjà, une exception est levée.
Les membres peuvent être supprimés en utilisant removeProperty()
, removeConstant()
,
removeMethod()
ou removeParameter()
.
Vous pouvez également ajouter des objets existants Method
, Property
ou Constant
à la
classe :
Vous pouvez cloner des méthodes, propriétés et constantes existantes avec un nom différent en utilisant
cloneWithName()
:
Interface ou Trait
Vous pouvez créer des interfaces et des traits (classes InterfaceType et TraitType) :
Utilisation des traits de caractère :
Résultat :
Enums
Vous pouvez facilement créer les enums que PHP 8.1 apporte (classe EnumType) :
Résultat :
Vous pouvez également définir des équivalents scalaires pour les cas afin de créer un enum adossé :
Il est possible d'ajouter un commentaire ou des attributs à chaque cas en utilisant
addComment()
ou addAttribute()
.
Classe anonyme
Donnez le nom null
et vous avez une classe anonyme :
Résultat :
Fonction globale
Le code des fonctions va générer la classe GlobalFunction:
Résultat :
Fermeture
Le code des fermetures va générer la classe Closure:
Résultat :
Fonction flèche
Vous pouvez également imprimer la fermeture comme fonction de flèche en utilisant une imprimante :
Résultat :
Signature de la méthode et de la fonction
Les méthodes sont représentées par la classe Method. Vous pouvez définir la visibilité, la valeur de retour, ajouter des commentaires, des attributs, etc :
Chaque paramètre est représenté par une classe Paramètre. Là encore, vous pouvez définir toutes les propriétés imaginables :
Pour définir les paramètres dits variadiques (ou également l'opérateur splat, spread, ellipsis, unpacking ou trois points),
utilisez setVariadic()
:
Génère :
Méthode et corps de fonction
Le corps peut être transmis à la méthode setBody()
en une seule fois ou de manière séquentielle (ligne par
ligne) en appelant à plusieurs reprises addBody()
:
Résultat
Vous pouvez utiliser des caractères de remplacement spéciaux pour injecter des variables de manière pratique.
Caractères de remplacement simples ?
Résultat :
Variadic placeholder ...?
Résultat :
Vous pouvez également utiliser les paramètres nommés de PHP 8 en utilisant des caractères de
substitution. ...?:
Échapper au caractère de remplacement avec une barre oblique \?
Résultat :
Imprimantes et conformité aux PSR
La classe Printer est utilisée pour générer du code PHP :
Il peut générer du code pour tous les autres éléments, en proposant des méthodes telles que printFunction()
,
printNamespace()
, etc.
En outre, la classe PsrPrinter
est disponible, dont la sortie est conforme au style de codage PSR-2 / PSR-12 /
PER :
Vous souhaitez adapter le comportement de votre imprimante à vos besoins ? Créez votre propre imprimante en héritant de la
classe Printer
. Vous pouvez reconfigurer ces variables :
En quoi et pourquoi la norme Printer
et PsrPrinter
diffère-t-elle exactement ? Pourquoi n'y a-t-il
pas qu'une seule imprimante, la PsrPrinter
, dans le paquet ?
La norme Printer
formate le code comme nous le faisons dans l'ensemble de Nette. Comme Nette a été créé bien
avant PSR, et aussi parce que PSR pendant de nombreuses années n'a pas fourni de normes à temps, mais parfois même avec
plusieurs années de retard par rapport à l'introduction d'une nouvelle fonctionnalité dans PHP, cela a entraîné quelques
différences mineures dans la norme de codage. La différence la
plus importante est l'utilisation de tabulations au lieu d'espaces. Nous savons qu'en utilisant des tabulations dans nos projets,
nous permettons d'ajuster la largeur, ce qui est essentiel pour les personnes souffrant de
déficiences visuelles. Un exemple de différence mineure est le placement de l'accolade sur une ligne séparée pour les
fonctions et les méthodes et toujours. Nous considérons que la recommandation du PSR est illogique et qu'elle conduit à une diminution de la clarté du code.
Types
Chaque type ou type d'union/intersection peut être passé comme une chaîne de caractères, vous pouvez également utiliser des constantes prédéfinies pour les types natifs :
Il en va de même pour la méthode setReturnType()
.
Littéraux
Avec Literal
, vous pouvez transmettre un code PHP arbitraire, par exemple, aux valeurs par défaut des
propriétés ou des paramètres, etc :
Résultat :
Vous pouvez également passer des paramètres à Literal
et les faire formater en code PHP valide à l'aide de caractères de remplacement spéciaux:
Le littéral représentant la création d'un nouvel objet est facilement généré par la méthode new
:
Attributs
Vous pouvez ajouter des attributs PHP 8 à toutes les classes, méthodes, propriétés, constantes, cas d'enum, fonctions, fermetures et paramètres. Les littéraux peuvent aussi être utilisés comme valeurs de paramètres.
Résultat :
Crochets de propriété
Vous pouvez également définir des crochets de propriété (représentés par la classe PropertyHook) pour les opérations get et set, une fonctionnalité introduite en PHP 8.4 :
Ceci génère :
Les propriétés et les crochets de propriété peuvent être abstraits ou finaux :
Visibilité asymétrique
PHP 8.4 introduit la visibilité asymétrique pour les propriétés. Vous pouvez définir des niveaux d'accès différents pour la lecture et l'écriture.
La visibilité peut être définie en utilisant la méthode setVisibility()
avec deux paramètres, ou en utilisant
setPublic()
, setProtected()
, ou setPrivate()
avec le paramètre mode
qui
spécifie si la visibilité s'applique à l'obtention ou à la définition de la propriété. Le mode par défaut est
'get'
.
Ceci génère :
Espace de nommage
Les classes, traits, interfaces et enums (ci-après dénommés „classes“) peuvent être regroupés en espaces de noms (PhpNamespace) :
Si la classe existe déjà, elle lève une exception.
Vous pouvez définir des déclarations d'utilisation :
Pour simplifier un nom de classe, de fonction ou de constante entièrement qualifié en fonction des alias définis, utilisez
la méthode simplifyName
:
Inversement, vous pouvez convertir un nom de classe, de fonction ou de constante simplifié en un nom pleinement qualifié en
utilisant la méthode resolveName
:
Résolution des noms de classe
Lorsqu'une classe fait partie d'un espace de noms, son rendu est légèrement différent: tous les types (par exemple, les indications de type, les types de retour, le nom de la classe mère, les interfaces implémentées, les traits utilisés et les attributs) sont automatiquement résolus (sauf si vous le désactivez, voir ci-dessous). Cela signifie que vous devez utiliser des noms de classe pleinement qualifiés dans les définitions, et qu'ils seront remplacés par des alias (basés sur des clauses d'utilisation) ou des noms pleinement qualifiés dans le code résultant :
Résultat :
La résolution automatique peut être désactivée de cette façon :
Fichiers PHP
Les classes, fonctions et espaces de noms peuvent être regroupés en fichiers PHP représentés par la classe PhpFile:
Résultat :
**Remarque : aucun code supplémentaire ne peut être ajouté aux fichiers en dehors des fonctions et des classes.
Générer en fonction de ceux qui existent déjà
En plus de pouvoir modéliser des classes et des fonctions à l'aide de l'API décrite ci-dessus, vous pouvez également les faire générer automatiquement en fonction de celles qui existent déjà :
Les corps des fonctions et des méthodes sont vides par défaut. Si vous souhaitez les charger également, utilisez cette
méthode (elle nécessite l'installation de nikic/php-parser
) :
Chargement depuis le fichier PHP
Vous pouvez également charger des fonctions, des classes, des interfaces et des enums directement à partir d'une chaîne de
code PHP. Par exemple, nous créons l'objet ClassType
de cette manière :
Lors du chargement de classes à partir de code PHP, les commentaires d'une seule ligne en dehors du corps des méthodes sont ignorés (par exemple pour les propriétés, etc.) car cette bibliothèque ne dispose pas d'une API pour les gérer.
Vous pouvez également charger directement le fichier PHP entier, qui peut contenir n'importe quel nombre de classes, de fonctions ou même plusieurs espaces de noms :
Le commentaire initial du fichier et la déclaration strict_types
sont également chargés. En revanche, tout
autre code global est ignoré.
Cela nécessite l'installation de nikic/php-parser
.
Si vous devez manipuler du code global dans des fichiers ou des instructions individuelles dans des corps de
méthodes, il est préférable d'utiliser directement la bibliothèque nikic/php-parser
.
Manipulateur de classe
La classe ClassManipulator fournit des outils pour manipuler les classes.
La méthode inheritMethod()
copie une méthode d'une classe parente ou d'une interface implémentée dans votre
classe. Cela vous permet de remplacer la méthode ou d'étendre sa signature :
La méthode inheritProperty()
copie une propriété d'une classe parente dans votre classe. Cette méthode est
utile lorsque vous souhaitez avoir la même propriété dans votre classe, mais éventuellement avec une valeur par défaut
différente :
La méthode implement()
implémente automatiquement toutes les méthodes et propriétés de l'interface ou de la
classe abstraite donnée :
Dumper de variables
La fonction Dumper renvoie la représentation d'une variable sous forme de chaîne PHP. Fournit une sortie meilleure et plus
claire que la fonction native var_export()
.
Tableau de compatibilité
PhpGenerator 4.1 est compatible avec PHP 8.0 à 8.4.