Cos’è la PHP Reflection API
La PHP Reflection API è una funzionalità integrata di PHP che permette di ottenere e ispezionare a runtime le meta-informazioni di classi, metodi, proprietà, funzioni e parametri. Puoi scoprire quali argomenti riceve un costruttore o quali attributi sono applicati a un metodo, senza modificare il codice sorgente. Laravel usa massicciamente la Reflection API dentroIlluminate/Container/Container.php per realizzare la risoluzione automatica del DI container, la lettura degli attributi PHP, la method injection e altro ancora.
Classi principali
ReflectionClass — informazioni sulla classe
ReflectionParameter — ispezionare gli argomenti del costruttore
Container di Laravel e Reflection API
L’IoC container di Laravel realizza la constructor injection (risoluzione automatica delle dipendenze) usando la Reflection API. Vediamo il meccanismo alla base diapp()->make(SomeClass::class) e della dependency injection.
Metodo build() del container (semplificato)
Il metodo build() reale di Container.php è più o meno così.
Util::getParameterClassName() è una utility che estrae la stringa del tipo dal risultato di $parameter->getType(). Fa da wrapper conveniente al ReflectionNamedType restituito da ReflectionParameter::getType().Lettura degli attributi PHP
Da PHP 8.0, tramite la Reflection API puoi ottenere gli attributi applicati a classi, metodi e proprietà. Laravel usa questo meccanismo per gestire gli attributi delle code e di Eloquent.Pattern base per leggere gli attributi
Come Laravel legge gli attributi Queue (semplificato)
Leggere gli attributi dei metodi
Utilizzi nello sviluppo di pacchetti
Verificare le interfacce implementate da una classe
In un pacchetto puoi verificare dinamicamente se una classe implementa una specifica interfaccia.Ottenere metadati — registrazione automatica delle rotte via attributi
Pattern per raccogliere e registrare rotte in modo automatico combinando attributi e Reflection.Chiamata dinamica di metodo — method injection
Il metodocall() di Laravel risolve gli argomenti automaticamente con la Reflection. Esempio di come implementare lo stesso meccanismo in un pacchetto.
Raccogliere i valori di default delle proprietà
Pattern per ottenere via Reflection i valori di default di una classe di configurazione.Considerazioni sulle performance
La Reflection API riparsa ogni volta le info di classe, quindi ha un costo. Nella produzione è best practice mettere in cache i risultati.Prossimi passi
Attributi PHP
Approfondisci gli attributi PHP letti tramite
ReflectionClass::getAttributes().Sviluppo di pacchetti
Impara a sviluppare pacchetti Laravel sfruttando la Reflection API.