[Résolu][PHP] Appel à une classe dynamique - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : [Résolu][PHP] Appel à une classe dynamique (/showthread.php?tid=3586) Pages :
1
2
|
[Résolu][PHP] Appel à une classe dynamique - Ter Rowan - 23-01-2009 j'allais vous demander comment faire mais j'ai trouvé une solution j'aimerais juste que vous me validiez la pertinence Code PHP :
évidemment le besoin étant d'avoir (mais issu d'un calcul, $laBonneClasse pouvant prendre la valeur maDeuxiemeClasse, etc...) Code PHP :
j'ai testé , ça a l air de marcher mais je voulais savoir si j'étais dans le php 'côté obscur' ou dans les bonnes pratiques. Si jamais ce n'est pas très bon, y a il une meilleure méthode ? merci d'avance RE: [php] appel a une classe dynamique - mdcarter - 23-01-2009 Personnellement j'utilise aussi cette méthode, et cela fonctionne bien. Pour être plus propre si jamais la liste de classes à instancié est limitée et connue, tu peut peut être simplement faire un switch sur $labonneClasse et instancié les objets "proprement" RE: [php] appel a une classe dynamique - Sephi-Chan - 23-01-2009 C'est effectivement faisable. Ça revient à utiliser le design pattern Factory, à ceci près que c'est plus… implicite. Quelques articles sur le sujet :
Sephi-Chan RE: [PHP] Appel à une classe dynamique - gameprog2 - 23-01-2009 ça sert à quoi en pratique ? RE: [PHP] Appel à une classe dynamique - Ter Rowan - 24-01-2009 (23-01-2009, 10:43 PM)gameprog2 a écrit : ça sert à quoi en pratique ? en pratique au moment où je programme je ne sais pas quel objet va être instancié (ou quelle classe, je confond les termes) je vais essayer de donner un exemple : j ai une classe vélo, une classe moto, une classe voiture ces trois classes ont les "mêmes" méthodes : - démarrer - accélérer - freiner chaque personnage a un véhicule, stocké en bdd toto -> vélo titi -> voiture l'idée est de ne faire qu'un programme qui permette de créer le bon objet (un vélo, une voiture, etc...) au moment de l'appel 0) $perso contient le nom (ou l id) du personnage concerné 1) je récupère dans $vehi le résultat select vehi from table where perso = '$perso' 2) $bonneClasse = f( $vehi); <- la fonction qui a partir de $vehi va calculer le nom de la classe pertinente (soit classe_voiture, classe_velo, etc..) 3) $vehicule est l'objet que je vais manipuler, je l'instancie $vehicule = new $bonneClasse (); 4) je manipule $vehicule->demarre(); $vehicule->accelere(); $vehicule->freine(); ainsi avec ce code que ce soit titi avec sa voiture ou toto avec son vélo, ce sont les bonnes méthodes qui sont appelées voilà j'espère que c'est clair ^^ RE: [PHP] Appel à une classe dynamique - Shao - 24-01-2009 Dans ce cas là, c'est clairement une factory que tu veux faire. Ta fonction 'f' au lieu de retrouver un nom de classe à utiliser, peut directement te donner le classe véhicule dont tu as besoin. imaginons que ta fonction 'f' soit en fait une méthode statique 'genererVehicule( $typeVehicule )', contenu dans une classe 'VehiculeFactory'. Il te reste donc à faire ceci
Par contre l'idéal serait que chacun de tes véhicules implémentent une interface IVehicule (qui contiendrait tes méthodes démarrer, freiner et accélérer) pour avoir un code plus clair. RE: [PHP] Appel à une classe dynamique - Ter Rowan - 24-01-2009 voui mais y a un truc que je ne comprends pas dans l affaire si j'ai bien compris, la méthode genererVehicule se finit par des "return new xxxx" or ce xxxx est possiblement supprimé à la fin de la fonction genererVehicule genererVehicule( $type ) { return new xxxx(); // créé ici // détruit ici ? } donc, soit, un objet xxxx est crée mais à la fin de genererVehicule la portée du new est bien dans la fonction et pas dans tout le script non ? RE: [PHP] Appel à une classe dynamique - Sephi-Chan - 24-01-2009 Justement, non. Ça retourne une instance de l'objet. Si tu fais :
La variable $jambon vaudra la même chose que si tu avais fais :
C'est tout l'intérêt de la Factory ! J'utilisais ça pour Seelies, pour instancier la Seelies selon qu'elle soit de Feu, d'Eau, etc. Sephi-Chan RE: [PHP] Appel à une classe dynamique - wild-D - 24-01-2009 sauf erreur en PHP4 il aurait "cloné" l'objet retourné (donc effectivement l'instance crée dans la factory aurait été détruite et tu aurais une copie) en PHP5 les objets sont toujours passé par référence. et sinon entre new $f(); Factory::create($f); la différence elle est surtout pour les puriste ... pour moi je vois pas l'intérêt des factory, sauf quand je veux "chainer", parce qu'on peut pas faire: new Moto()->accelerer(); alors que l'on peut faire: Factory::create('Moto')->accelerer(); RE: [PHP] Appel à une classe dynamique - Adrien A. - 24-01-2009 Le design factory permet d'encapsuler et donc de faire des vérification et du code propres et surtout debugable très facilement. Code PHP :
Si la classe MyClass n'est pas une implementation de MyInterface, MyFactory::build() lève une exception. C'est pas super long à écrit, et au moins on est sur de pas faire de bêtises. Il faudrait aussi peut être faire un test sur la validité de la classe construite mais bon... |