Passer au contenu principal

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 instruction use.

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 -r passe 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.
Autrement dit, quand vous voulez « éditer du code via l’AST », il est plus pratique d’utiliser une bibliothèque AST côté userland plutôt que l’AST interne du runtime PHP.

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

composer require nikic/php-parser

Exemple de parsing (transformer du code en AST)

<?php

use PhpParser\Error;
use PhpParser\ParserFactory;

$code = <<<'CODE'
<?php
function greet(string $name): void {
    echo "Hello, {$name}";
}
CODE;

$parser = (new ParserFactory())->createForNewestSupportedVersion();

try {
    $ast = $parser->parse($code);
} catch (Error $error) {
    echo "Parse error: {$error->getMessage()}\n";
    return;
}

Parcourir et modifier l’AST avec le pattern NodeVisitor

<?php

use PhpParser\Node;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitorAbstract;

$traverser = new NodeTraverser();

$traverser->addVisitor(new class extends NodeVisitorAbstract {
    public function leaveNode(Node $node)
    {
        if ($node instanceof Node\Scalar\Int_) {
            return new Node\Scalar\String_((string) $node->value);
        }
    }
});

$modifiedAst = $traverser->traverse($ast);
En héritant de 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

<?php

use PhpParser\PrettyPrinter;

$prettyPrinter = new PrettyPrinter\Standard();
$newCode = $prettyPrinter->prettyPrintFile($modifiedAst);

echo $newCode;
Avec ce flux, l’objet de transformation devient « le code en tant qu’arbre syntaxique » plutôt que « le code en tant que chaîne ».

Exemple d’utilisation dans Laravel/Chisel

laravel/chisel est une bibliothèque qui découpe a posteriori les starter kits. Son composer.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 :
  1. Parse le code avec ParserFactory::createForNewestSupportedVersion().
  2. Ajoute plusieurs Visitors (comme RemoveImportVisitor) à un NodeTraverser pour la transformation.
  3. Ré-écrit en préservant le formatage d’origine via printFormatPreserving() de PhpParser\PrettyPrinter\Standard.
Grâce à cette conception, la suppression d’instructions 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 de nikic/php-parser dans un petit CLI.
Dernière modification le 13 juillet 2026