Qu’est-ce qu’un AST PHP
Un AST (Abstract Syntax Tree, arbre syntaxique abstrait) est une structure arborescente qui décompose un code source en éléments porteurs de sens. Lorsque vous créez un outil de génération de code, d’analyse statique ou de refactoring automatique, l’AST est une fondation quasi indispensable. Là où un remplacement de chaîne casse facilement, l’AST permet de manipuler en toute sécurité les unités syntaxiques comme un appel de fonction, une déclaration de classe ou une instructionuse.
L’AST interne de PHP
Depuis PHP 7, le moteur Zend ne convertit pas le code PHP directement en opcode : il produit d’abord un AST interne, qui est ensuite compilé.- Même un code d’une ligne exécuté via
php -rpasse en interne par la même pipeline de compilation. - OPcache met en cache et réutilise l’opcode finalement produit.
- Dans le développement d’applications classiques, vous n’avez presque jamais l’occasion de manipuler directement cet AST interne.
Le package nikic/PHP-Parser
nikic/PHP-Parser est la bibliothèque standard pour analyser, parcourir et régénérer du code PHP sous forme d’AST. Le README et la documentation officielle décrivent le flux de base en trois étapes.Installation
Exemple de parsing (transformer du code en AST)
Parcourir et modifier l’AST avec le pattern NodeVisitor
NodeVisitorAbstract, vous n’implémentez que les hooks nécessaires (enterNode / leaveNode). Pour des transformations complexes, il est efficace de collecter des informations dans enterNode et d’effectuer les remplacements dans leaveNode.
Régénérer le code avec le Pretty Printer
Exemple d’utilisation dans Laravel/Chisel
laravel/chisel est une bibliothèque qui découpe a posteriori les starter kits. Soncomposer.json inclut nikic/php-parser en version 5.x comme dépendance.
Dans Laravel\Chisel\Ast\Source, Chisel exécute l’édition d’AST comme suit :
- Parse le code avec
ParserFactory::createForNewestSupportedVersion(). - Ajoute plusieurs Visitors (comme
RemoveImportVisitor) à unNodeTraverserpour la transformation. - Ré-écrit en préservant le formatage d’origine via
printFormatPreserving()dePhpParser\PrettyPrinter\Standard.
use, de traits ou d’interfaces s’effectue en toute sécurité au niveau syntaxique, et non par remplacement de texte.
Cas d’utilisation
Recourir à l’AST facilite les développements suivants :- CLI de génération de code (édition à l’unité syntaxique après création du squelette).
- Outils d’analyse statique (détection de constructions particulières, de violations de règles).
- Refactoring automatique (semi-automatisation des migrations d’API ou des renommages).
- Post-traitement de templates de projet (suppression/remplacement de fonctionnalités, à la manière de Chisel).
Conclusion
L’AST PHP n’est pas une fonctionnalité utilisée au quotidien dans le développement Laravel classique. En revanche, si vous vous lancez dans le développement d’outils ou de packages, l’AST est une base puissante pour réaliser des modifications de code « robustes et reproductibles ». Commencez par expérimenter Parser, Visitor et Pretty Printer denikic/php-parser dans un petit CLI.