JeuWeb - Crée ton jeu par navigateur

Version complète : [Résolu][PHP] Appel à une classe dynamique
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Pages : 1 2
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
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"
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
ça sert à quoi en pratique ?
(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 ^^
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
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 ?
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
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();
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...
Pages : 1 2