Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2324 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Création dynamique de classe en PHP5 ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Création dynamique de classe en PHP5 ?

n°1500210
Luigi
Living's easy with eyes closed
Posté le 08-01-2007 à 10:53:16  profilanswer
 

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
mood
Publicité
Posté le 08-01-2007 à 10:53:16  profilanswer
 

n°1500221
gizmo
Posté le 08-01-2007 à 11:01:58  profilanswer
 

ReflectionClass

n°1500223
Luigi
Living's easy with eyes closed
Posté le 08-01-2007 à 11:08:53  profilanswer
 

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 :)

n°1500246
FlorentG
Unité de Masse
Posté le 08-01-2007 à 12:20:03  profilanswer
 

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'));

n°1500606
leflos5
On est ou on est pas :)
Posté le 09-01-2007 à 02:37:26  profilanswer
 

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

n°1500709
rufo
Pas me confondre avec Lycos!
Posté le 09-01-2007 à 11:43:25  profilanswer
 

leflos5 a écrit :

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


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

n°1500713
leflos5
On est ou on est pas :)
Posté le 09-01-2007 à 12:00:48  profilanswer
 

rufo a écrit :

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


Bah non  :heink:

n°1501421
Luigi
Living's easy with eyes closed
Posté le 10-01-2007 à 17:34:33  profilanswer
 

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 !

n°1501427
art_dupond
je suis neuneu... oui oui !!
Posté le 10-01-2007 à 17:42:06  profilanswer
 

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
n°1502424
weed
Posté le 12-01-2007 à 22:29:08  profilanswer
 

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

mood
Publicité
Posté le 12-01-2007 à 22:29:08  profilanswer
 

n°1502462
leflos5
On est ou on est pas :)
Posté le 13-01-2007 à 01:35:38  profilanswer
 

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

n°1502531
FlorentG
Unité de Masse
Posté le 13-01-2007 à 14:46:37  profilanswer
 

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. }

n°1502544
leflos5
On est ou on est pas :)
Posté le 13-01-2007 à 15:41:33  profilanswer
 

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;

n°1502560
FlorentG
Unité de Masse
Posté le 13-01-2007 à 17:04:58  profilanswer
 

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.        }


n°1502587
leflos5
On est ou on est pas :)
Posté le 13-01-2007 à 19:34:59  profilanswer
 

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

n°1507964
CyberDenix
Posté le 28-01-2007 à 14:58:55  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Création dynamique de classe en PHP5 ?

 

Sujets relatifs
ming 0.4 et php5Requête sous Access, mode création ou SQL
[C++] Aide à la création d'un makefileTableau dynamique sous ASP.net (C# et SQL Server)
HELP création de 'n' boutonsCreation site d'enchere?
[Java] Classe File : méthodes delete() et renameTo() sans effet !probleme creation de tables
Utilisation classe Runtime ds servlet[SQL Server 2005] Procédure stockée dynamique ?
Plus de sujets relatifs à : Création dynamique de classe en PHP5 ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR