PHP -Exemple Réflexion-

Ajouter un commentaire

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