Les bases de la reflection

    Publié le : 25-09-2020 17:01

    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