Cos’è l’AST di PHP
L’AST (Abstract Syntax Tree — albero sintattico astratto) è una struttura ad albero che scompone il codice sorgente in una “struttura significativa”. Quando crei tool di generazione di codice, tool di analisi statica o strumenti di refactoring automatico, l’AST è quasi sempre la base indispensabile. Trasformazioni che con la semplice sostituzione di stringhe risulterebbero fragili, con l’AST puoi gestirle in sicurezza a livello di unità sintattiche come “function call”, “class declaration” o “statementuse”.
L’AST interno di PHP
Da PHP 7 in poi, la Zend Engine non converte direttamente il codice PHP in opcode: prima lo trasforma in un AST interno e poi lo compila.- Anche una riga di codice eseguita con
php -rpassa internamente per la stessa pipeline di compilazione - OPcache mette in cache l’opcode finale generato per riutilizzarlo
- Nello sviluppo di applicazioni standard, quasi mai avrai occasione di manipolare direttamente questo AST interno
Il pacchetto nikic/PHP-Parser
nikic/PHP-Parser è la libreria standard per analizzare, attraversare e rigenerare codice PHP come AST. Il README e la documentazione ufficiale illustrano tre passaggi fondamentali.Installazione
Esempio base di parsing (dal codice all’AST)
Attraversare e modificare l’AST con il pattern NodeVisitor
NodeVisitorAbstract puoi implementare solo gli hook necessari (enterNode / leaveNode). Nelle trasformazioni complesse è utile raccogliere informazioni in enterNode e sostituire in leaveNode.
Rigenerare il codice con il Pretty Printer
Esempio d’uso in Laravel/Chisel
laravel/chisel è una libreria che post-elabora gli starter kit per rimuoverne parti. Incomposer.json include la 5.x di nikic/php-parser come dipendenza.
In Laravel\Chisel\Ast\Source, Chisel esegue le modifiche dell’AST con questi passaggi.
- Parsing del codice con
ParserFactory::createForNewestSupportedVersion() - Aggiunta di più Visitor (come
RemoveImportVisitor) a unNodeTraverserper le trasformazioni - Riscrittura preservando la formattazione originale con
printFormatPreserving()diPhpParser\PrettyPrinter\Standard
use, trait e interfacce a livello di sintassi, invece che con sostituzioni testuali.
Casi d’uso
L’AST facilita sviluppi come questi.- CLI per la generazione di codice (modifica per unità sintattiche dopo aver creato uno scaffold)
- Tool di analisi statica (rilevamento di sintassi specifiche o violazioni di regole)
- Refactoring automatico (semi-automatizzazione di migrazioni API o rinomine)
- Post-processing di template di progetto (rimozione o sostituzione di funzionalità, come in Chisel)
Riepilogo
L’AST di PHP non è una funzionalità che usi tutti i giorni nello sviluppo di applicazioni Laravel. Tuttavia, se ti occupi di tool o di sviluppo di pacchetti, l’AST diventa una base potente per modifiche al codice “difficili da rompere e riproducibili”. Inizia sperimentando i tre elementi dinikic/php-parser — Parser, Visitor, Pretty Printer — in una piccola CLI.