JeuWeb - Crée ton jeu par navigateur
[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 :
<?php 
$laBonneClasse
= 'maClasse';

$maRessource = new $laBonneClasse('a','b','c');

évidemment le besoin étant d'avoir (mais issu d'un calcul, $laBonneClasse pouvant prendre la valeur maDeuxiemeClasse, etc...)

Code PHP :
<?php 
$maRessource
= new maClasse('a','b','c');

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

$vehicule = VehiculeFactory::genererVehicule( $type ) ;
$vehicule->demarre() ;
$vehicule->freine() ;
$vehicule->accelere() ;

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


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 :
$jambon = vehiculeFactory::generate('moto');

La variable $jambon vaudra la même chose que si tu avais fais :
$jambon = new Moto();

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 :
<?php 
interface MyInterface
{
public function
myFunction();
}

class
MyFactory
{
public static function
build($sType)
{
$oObject = new $sType();
if (!(
$oObject instanceof MyInterface))
throw new
IllegalArgumentException();
return new
$sType();
}
}

$oMyObject = MyFactory::build('MyClass');
C'est du PHP5.

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