Dans cet article, je vais partager avec vous un exemple poussé de l’utilisation de l’API Reflection.
Merci de revoir l’article précédent sur l’API Reflection afin de mieux comprendre
Cet exemple simule un garage dans lequel nous pouvons garer plusieurs types de véhicules. Ce garage est spécialisé dans la peinture de carrosserie de masse et peut donc repeindre tous les véhicules en même temps
Cet exemple est pris du livre : PHP 5.5 – Préparation à la certification Zend Certified PHP Engineer (ZCPE) de Cyrille Grandval,Julien Charpentier ( 8 avril 2015 )
abstract class Vehicule { public $couleur = 'noire'; } class Voiture extends Vehicule { public function __construct() { $this->couleur = 'blanche'; } public function repeindre($couleur) { $this->couleur = $couleur; } } class Moto extends Vehicule { public function repeindre($couleur) { $this->couleur = $couleur; } } class Camion extends Vehicule {}
Il est demandé de mettre chaque classe dans un fichier séparé afin de respecter les bonnes pratiques PHP.
Voici le code de la classe qui implémente l’API Reflection
class Garage { private $vehicule = array(); public function gare(Vehicule $vehicule) { $this->vehicule[] = $vehicule; } public function inventaire() { echo '- Inventaire : '; foreach ($this->vehicule as $vehicule) { echo get_class($vehicule) . ' de couleur '. $vehicule->couleur. ' '; } } public function repeindreVehicules($couleur) { foreach ($this->vehicule as $vehicule) { $reflector = new ReflectionClass(get_class($vehicule)); $methods = $reflector->getMethods(ReflectionMethod::IS_PUBLIC); foreach ($methods as $method) { if ('repeindre' == $method->getName()) { $method->invoke($vehicule, $couleur); } } } } }
Au final, voici comment utiliser le code écrit ci-dessus
$garage = new Garage; $reflectionVoiture = new ReflectionClass('Voiture'); $garage->gare($reflectionVoiture->newInstance()); $garage->gare($reflectionVoiture->newInstanceWithoutConstructor()); $garage->gare(new Moto()); $garage->gare(new Camion()); $garage->inventaire(); /* - Inventaire : Voiture de couleur blanche Voiture de couleur noire Moto de couleur noire Camion de couleur noire */ $garage->repeindreVehicules('vertes'); $garage->inventaire(); /* - Inventaire : Voiture de couleur vertes Voiture de couleur vertes Moto de couleur vertes Camion de couleur noire */
L’ensemble des véhicules du garage est parcouru à la recherche de l’existence d’une méthode repeindre dans leurs méthodes publiques, si c’est le cas elle est invoquée à la volée