JeuWeb - Crée ton jeu par navigateur
[Résolu] Include dynamique… Suis-je parti en vrille ? - 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] Include dynamique… Suis-je parti en vrille ? (/showthread.php?tid=4445)



[Résolu] Include dynamique… Suis-je parti en vrille ? - Ter Rowan - 17-11-2009

hello

J'implémente de plus en plus dans mon jeu (je devrais dire projet voire utopie mais bon ^^) ce qui tend à ressembler aux modèle Factory et Strategy (merci pour ces concepts là d'ailleurs)

mais du coup, je me pose une question de performance. En effet, la création dynamique d'objets avec un choix dynamique de la (des) classe(s) utile(s) impliquent d'avoir inclus l'ensemble des fichiers php portant les sources des classes utilisées


Et c'est là que le bas (bât ?) blesse

grosso modo j'envisage un protocode du type :

Code PHP :
<?php 
class F
{
protected
$ListeObjets;

// creer la liste des objets en fonction de tableau de données $enregs[objet][donnée de l'objet]
function CreerListe( $enregs)
{
foreach (
$enregs as $enreg)
{
$classe = $enreg['Type'];
// création de l'objet concerné
$ListeObjets[ $enreg['id'] ] = new $classe($enreg);
}
}
}
et là, il faut bien inclure tous les fichiers sources des classes 'type' (on imagine que le fichier a pour nom le nom de la classe qui est stocké dans $enreg['Type'])

je vois deux possibilités :
- la secure facile : je fais en début de code autant d'include qu'il y a de classes susceptibles d'être instanciées par la classe F
- celle que je crois optimisée mais j'ai un doute. Je fais des includes dans la boucle foreach, en dynamique donc
Code PHP :
<?php 
class F
{
protected
$ListeObjets;

// creer la liste des objets en fonction de tableau de données $enregs[objet][donnée de l'objet]
function CreerListe( $enregs)
{
foreach (
$enregs as $enreg)
{
$classe = $enreg['Type'];
include_once (
$enreg['Type'].'.php'); //c'est ici que ca se passe
// création de l'objet concerné
$ListeObjets[ $enreg['id'] ] = new $classe($enreg);
}
}
}

mais ça me perturbe, ca voudrait dire que je peux déclarer des classes dans le code d'autres classes, imbriquer le tout joyeusement...

qu'en pensez vous ?

edit : j'oubliais : supposons qu'on soit dans le cas ou 50... 100 ... 1000 classes sont possibles et que seuls 5-6 objets sont créés


RE: Include dynamique...suis je parti en vrille ? - Anthor - 17-11-2009

Ça doit passer avec l'autoload non ?


RE: Include dynamique...suis je parti en vrille ? - Ter Rowan - 17-11-2009

arf j'ai cherché sur l'autoload il y a quelques jours intrigué par je ne sais plus quelle réponse, et soit je me suis planté dans google, soit je n'ai vraiment pas été convaincu par les exemples présentés.

ma vision de l'autoload : un script qui est appelé pour gérer les classes et identifie où sont stockées (dans quel répertoire) les classes.

du coup, sauf que j'ai le doute parce que c'est toi qui m'en parle, mais je me demande quel est le lien ? (en plus suis fatigué et me suis un peu chauffé aujourd'hui :rip: donc cerveau pas très clair)


RE: Include dynamique...suis je parti en vrille ? - Sephi-Chan - 17-11-2009

L'autoload permet d'inclure à la volée un fichier contenant une déclaration de classe (selon une règle d'inflexion que tu auras défini toi même dans la fonction __autoload() quand c'est nécessaire.

Cf. PHP - Autoloading classes


function __autoload($class_name) {
require_once $class_name . '.php';
}

Ça semble convenir à tes besoins… Mais peut-être ai-je mal compris ce que tu souhaitais faire.


Sephi-Chan


RE: Include dynamique...suis je parti en vrille ? - My Hotel - 17-11-2009

L'autoload, c'est une fonction : __autoload($class_name) que tu déclares au début de chaque script, qui charge dynamiquement les classes. C'est à dire : quand tu fais appel à une classe dans ton script, sans l'avoir inclus précédemment, il la charge automatiquement.

Genre tu peux faire :
Code PHP :
<?php 
function __autoload($class_name)//Ton autoload très basique :)
{
require(
'classes/'.$class_name.'.class.php');
}
$character = new Character(1);
Config::getInstance()->section(4);//Etc, sans include quelconque

C'est plus clair? Smile

Donc pour moi, ça convient parfaitement, faut juste adopter un rangement unifié pour tes classes, puis définir ton autoload au début de ton script, et quand ta factory voudra instancier une classe, elle sera automatiquement incluse.
Bye

EDIT : grilled par Sephi -_-


RE: Include dynamique...suis je parti en vrille ? - Anthor - 17-11-2009

Pour le rangement unifié, il suffit de remplacer les _ par des / par exemple, ainsi tu peux ranger tes classes dans des répertoires distincts. De même tu peux retrouver un fichier grâce au nom de la classe.

Par exemple la classe Zend_Search_Lucene se trouvent forcement dans Zend/Search/Lucene.php


RE: Include dynamique...suis je parti en vrille ? - Ter Rowan - 17-11-2009

oki la dessus mais... quelle différence par rapport à mon script, il bugguerait (je l'ai pas testé) parce que l'include est dans le code d'une classe plutôt qu'en dehors ? en fait je ne vois pas trop l'intérêt de l'autoload alors que je croyait à une "magie" au départ


de plus j'ai lu qu'avec require, php n'évaluait que la première fois $classe donc si on a plusieurs valeurs qui arrivent les unes après les autres à $classe (factory par exemple) on se retrouverait avec require avec une seule et même classe chargée contrairement à l'include qui est évalué à chaque itération ? info ou un tox ?


RE: Include dynamique...suis je parti en vrille ? - Anthor - 17-11-2009

le _once n'évalue qu'une fois, le require renvoi une alerte et une erreur fatale, le include ne lance qu'une alerte.

Ton script ne buggera pas, simplement tu devras penser à inclure partout ou nécessaire alors que l'autoload est fait pour ça.


RE: [Résolu]Include dynamique...suis je parti en vrille ? - Ter Rowan - 17-11-2009

oki merci Smile

je comprends mieux