Les bases de la reflection

Publié le : 25-11-2018 18:15

La reflection sert d'une manière générale à rendre du code dynamique. Il est possible (entre autre chose) d'instancier des classes, de collecter des informations sur les niveaux d'accès des fonctions et des variables de ces classes. Il est également possibler d'appeler des méthodes. La reflection c'est le genre de concepte qui permet de créer un système modulaire (architecture modulable, système d'add-on) complet (tout en restant relativement peu complexe).

Exemple d'une fragment de code qui instancie la classe Vue se trouvant dans un namespace spécifique au module \Mod_Module puis appel la méthode Get_Methode si celle-ci est bien de type static

function Get_Module_Vue($in_Module,$in_Method,$in_Params,$in_D,$in_U){
	try{
		//Ajout des dépendances du module
		require_once($this->Get_Path_Module($in_Module));
		
		$Name_Class = '\Mod_'.$in_Module.'\Vue';
		$Name_Method = 'Get_'.$in_Method;
		$Reflection_Class = new \ReflectionClass($Name_Class);

		//Contrôle de la présence dans le namespace
		if(!$Reflection_Class->inNamespace()){ throw new \Exception("La vue du module : Mod_" . $in_Module . " demandé est inéxistante."); }

		//Crée l'objet
		$Dynamic_Class = $Reflection_Class->newInstanceArgs();

		//Appel de la méthode
		$Method_Arguments = array($in_Params,$in_D, $this,$in_U);
		$Reflection_Method = new \ReflectionMethod($Dynamic_Class, $Name_Method );

		//Contrôle que la méthode est bien statique
		if(!$Reflection_Method->isStatic()){ throw new \Exception("La méthode " . $Name_Method  . " du module : Mod_" . $in_Module . " de la Vue demandée n'est pas static."); }
		return $Reflection_Method->invokeArgs($Dynamic_Class, $Method_Arguments);
	}
	catch(Exception $e){
		throw $e;
	}

Plus d'informations sur la reflection