Création dynamique de classe en PHP5 ?

Création dynamique de classe en PHP5 ? - PHP - Programmation

Marsh Posté le 08-01-2007 à 10:53:16    

Salut à tous :)
 
D'avance, désolé si ma question a déjà sa réponse ici, j'ai fait pas mal de recherche dans google, la doc php.net et ici même sans rien trouver :(
 
Ma question est toute simple. J'utilisais ce genre de code en PHP 4 :
 

Code :
  1. $class_name = "ma_classe";
  2. $obj = new $class_name;


 
(ça n'a évidemment aucun intérêt dans cet exemple, c'est juste pour illustrer le mécanisme)
 
Je suis passé sur PHP5, et apparemment ça ne passe plus.
 
Malheureusement, je ne sais même pas quelle erreur il retourne, l'affichage d'erreur étant désactivé sur ce serveur (et je n'ai pas les droits dessus) (d'ailleurs si quelqu'un sait comment réactiver cet affichage dans mes scripts, je suis preneur :)).
 
Quelqu'un sait quel est le problème ? Et comment effectuer ce genre d'opération en PHP 5 ?
 
Merci d'avance ! :hello:


Message édité par Luigi le 08-01-2007 à 10:53:31
Reply

Marsh Posté le 08-01-2007 à 10:53:16   

Reply

Marsh Posté le 08-01-2007 à 11:01:58    

ReflectionClass

Reply

Marsh Posté le 08-01-2007 à 11:08:53    

Mmmm j'avais effectivement utilisé ça quand j'avais voulu faire ce genre de choses en Java, je vais jeter un oeil dans cette direction, thx :)

Reply

Marsh Posté le 08-01-2007 à 12:20:03    

Code :
  1. $class = new ReflectionClass('ma_classe');
  2. $instance = $class->newInstance();


 
Avec paramètres :

Code :
  1. $instance = $class->newInstance('pouet', 'tagada', 'truc');


 
Avec paramètres dans tableau (très utile) (PHP 5.1.3)

Code :
  1. [code]$instance = $class->newInstance(array('pouet', 'tagada', 'truc'));

Reply

Marsh Posté le 09-01-2007 à 02:37:26    

Je comprends pas chez moi ça marche toujours en 5.2 :spamafote:

Reply

Marsh Posté le 09-01-2007 à 11:43:25    

leflos5 a écrit :

Je comprends pas chez moi ça marche toujours en 5.2 :spamafote:


 
t'avais peut-être activé le mode "compatibilité php4"?

Reply

Marsh Posté le 09-01-2007 à 12:00:48    

rufo a écrit :

t'avais peut-être activé le mode "compatibilité php4"?


Bah non  :heink:

Reply

Marsh Posté le 10-01-2007 à 17:34:33    

De mon côté je suis en 5.0.2, et ça marche nickel avec la reflection, codé comme florent a montré (j'ai effectivement trouvé ça dans la doc php).
 
Merci à tous !

Reply

Marsh Posté le 10-01-2007 à 17:42:06    

youp,
 
vous pourriez donner quelques exemples où utiliser ça ?
 
 
merci :)
 
 
edit: ah bah oui, pour créer des classes dynamique ; suis-je neuneu...


---------------
oui oui
Reply

Marsh Posté le 12-01-2007 à 22:29:08    

c'est assez spécifique comme utilisation.  
 
Vous avez deja utilisé des classes dynamique? j'en vois pas trop l'utilité personnellement?

Reply

Marsh Posté le 12-01-2007 à 22:29:08   

Reply

Marsh Posté le 13-01-2007 à 01:35:38    

Par exemple juste pour créer des objets dont tu connais pas forcément le type dès le départ :spamafote:

Reply

Marsh Posté le 13-01-2007 à 14:46:37    

weed a écrit :

Vous avez deja utilisé des classes dynamique? j'en vois pas trop l'utilité personnellement?


Obligatoire dans un framework par exemple, avec genre mappage URL / Classe. Genre une adresse "pouet.html" renvoi à la classe pouet, donc pour instancier dynamiquement la classe je passe par Reflection dans une belle Factory. Exemple :

Code :
  1. class Controller_Factory
  2. {
  3. ...
  4.   public function create($id)
  5.   {
  6.      require_once($id . '.php');
  7.  
  8.     $class = new ReflectionClass($id);
  9.     return $classe->newInstance();
  10.   }
  11. }

Reply

Marsh Posté le 13-01-2007 à 15:41:33    

FlorentG a écrit :

Obligatoire dans un framework par exemple, avec genre mappage URL / Classe. Genre une adresse "pouet.html" renvoi à la classe pouet, donc pour instancier dynamiquement la classe je passe par Reflection dans une belle Factory. Exemple :

Code :
  1. class Controller_Factory
  2. {
  3. ...
  4.   public function create($id)
  5.   {
  6.      require_once($id . '.php');
  7.  
  8.     $class = new ReflectionClass($id);
  9.     return $classe->newInstance();
  10.   }
  11. }



Ca risque pas de marcher ton truc :o Et le test sur l'existence :o
 
:whistle:
 
Je maintiens que pour faire ça, j'y vais toujours à la sauvage avec un vulgaire

Code :
  1. $classe='maClasse';
  2. $instance=new $classe;

Reply

Marsh Posté le 13-01-2007 à 17:04:58    

leflos5 a écrit :

Ca risque pas de marcher ton truc :o Et le test sur l'existence :o


C'est un exemple pourri :o 'tain tu peux pas poster un truc d'exemple sans que ce soit parfait :o
 
Tu préfère ça ?
 

Code :
  1. public function create($id)
  2.        {
  3.            $id = strtolower($id);
  4.    
  5.            $basePath = str_replace('_', DIRECTORY_SEPARATOR, $id);
  6.  
  7.            if(!class_exists($id, false)) {
  8.  
  9.                $file = $this->sitePath . $basePath . '.controller.php';
  10.  
  11.                require_once($file);
  12.            }
  13.  
  14.            try {
  15.  
  16.                $controllerClass = new ReflectionClass($id);
  17.  
  18.                if(!$controllerClass->isSubClassOf(new ReflectionClass('Controller'))) {
  19.                    throw new Controller_Exception_MalFormedController('Controller "' . $id . '" in "' . $file . '" must extend Controller');
  20.                }
  21.  
  22.                $fsDataPath = $this->sitePath . $basePath;
  23.                $wsDataPath = (DIRECTORY_SEPARATOR == '/' ? $basePath : str_replace(DIRECTORY_SEPARATOR, '/', $basePath));
  24.  
  25.                $controller  = $controllerClass->newInstance($id, $fsDataPath, $fsDataPath, $wsDataPath);
  26.  
  27.                return $controller;
  28.  
  29.            } catch(ReflectionException $e) {
  30.  
  31.                throw new Controller_Exception_MalFormedController('MalFormed declaration in "' . $file . '". Controller class should be "' . $id . '"');
  32.  
  33.            } catch(Exception $e) {
  34.  
  35.                throw $e;
  36.            }
  37.  
  38.        }


Reply

Marsh Posté le 13-01-2007 à 19:34:59    

FlorentG a écrit :

C'est un exemple pourri :o 'tain tu peux pas poster un truc d'exemple sans que ce soit parfait :o
 
Tu préfère ça ?
 

Code :
  1. public function create($id)
  2.        {
  3.            $id = strtolower($id);
  4.    
  5.            $basePath = str_replace('_', DIRECTORY_SEPARATOR, $id);
  6.  
  7.            if(!class_exists($id, false)) {
  8.  
  9.                $file = $this->sitePath . $basePath . '.controller.php';
  10.  
  11.                require_once($file);
  12.            }
  13.  
  14.            try {
  15.  
  16.                $controllerClass = new ReflectionClass($id);
  17.  
  18.                if(!$controllerClass->isSubClassOf(new ReflectionClass('Controller'))) {
  19.                    throw new Controller_Exception_MalFormedController('Controller "' . $id . '" in "' . $file . '" must extend Controller');
  20.                }
  21.  
  22.                $fsDataPath = $this->sitePath . $basePath;
  23.                $wsDataPath = (DIRECTORY_SEPARATOR == '/' ? $basePath : str_replace(DIRECTORY_SEPARATOR, '/', $basePath));
  24.  
  25.                $controller  = $controllerClass->newInstance($id, $fsDataPath, $fsDataPath, $wsDataPath);
  26.  
  27.                return $controller;
  28.  
  29.            } catch(ReflectionException $e) {
  30.  
  31.                throw new Controller_Exception_MalFormedController('MalFormed declaration in "' . $file . '". Controller class should be "' . $id . '"');
  32.  
  33.            } catch(Exception $e) {
  34.  
  35.                throw $e;
  36.            }
  37.  
  38.        }



 
Ca aurait suffit :o

Code :
  1. public function create($id)
  2.   {
  3.      require_once($id . '.php');
  4.  
  5.     $classe = new ReflectionClass($id);
  6.     return $classe->newInstance();
  7.   }


:D

Reply

Marsh Posté le 28-01-2007 à 14:58:55    

Arretez de vous battre, le gars a juste oublié les parenthèses :)
il faut ecrire
  $toto = new $nomclasse();
au lieu de
  $toto = new $nomclasse;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed