JeuWeb - Crée ton jeu par navigateur
php __autoload - 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 : php __autoload (/showthread.php?tid=6659)

Pages : 1 2 3


RE: php __autoload - Xenos - 04-03-2013

J'ai pas compris l'histoire de "controleur / controleur principal". La fonction doit être incluse dans la page web à charger (note que cela oblige à faire un require ou include :p).
Les "if" en cascade ne sont pas recommandés: utilise un swicth($classname) { case ... }
Le problème, ou plutôt la difficulté, c'est qu'il te faut "référencer" chaque fichier de classe dans cette fonction __autoload. Avec le système précédant, tu n'avais pas besoin de faire ce référencement.

C'est un choix qu'il te faut faire. Le premier, avec les _, est facile car automatique, mais il n'est pas souple car les noms de classe doivent correspondre aux noms de fichier. Le second est bien plus souple, mais il est manuel.


RE: php __autoload - php_addict - 04-03-2013

(04-03-2013, 12:09 PM)Xenos a écrit : J'ai pas compris l'histoire de "controleur / controleur principal". La fonction doit être incluse dans la page web à charger (note que cela oblige à faire un require ou include :p).

je parlais du controleur du modèle MVC


RE: php __autoload - niahoo - 04-03-2013

L'idée que tu proposes c'est d'avoir un dossier class avec toutes tes classes dedans. La corrspondance Dossiers/underscores et/ou dossiers/Namespaces permet à chaque dépendance de rester bien au chaud dans son propre dossier et donc d'éviter les conflits de noms de fichier et d'être mis à jour facilement.


RE: php __autoload - php_addict - 04-03-2013

(04-03-2013, 12:34 PM)niahoo a écrit : L'idée que tu proposes c'est d'avoir un dossier class avec toutes tes classes dedans. La corrspondance Dossiers/underscores et/ou dossiers/Namespaces permet à chaque dépendance de rester bien au chaud dans son propre dossier et donc d'éviter les conflits de noms de fichier et d'être mis à jour facilement.

oui l'idée est très tentante, malgré le fait que cela fait des trucs comme:

Code :
new class_rep_nomDeLaClasse();

je n'ai qu'une seule classe par fichier, sauf pour phpmailer http://sourceforge.net/projects/phpmailer/ qui possedent 2 classes dans le même fichier:

class PHPMailer {}

et

class phpmailerException extends Exception {}

et le bout de code non encapsulé dans une classe que je vais m'empresser de le mettre dans le constructeur __construct():


if (version_compare(PHP_VERSION, '5.0.0', '<') ) exit("Sorry, this version of PHPMailer will only run on PHP version 5 or greater!\n");

là il va falloir que je revoir le code de phpmailer, mais ca ne m'enchante guère, pas facile...


RE: php __autoload - niahoo - 04-03-2013

Pourquoi le mettre dans le constructeur ? c'est inutile. Avec l'autoload si tu charges le fichier c'est pour instancier ta classe. Donc en le laissant en haut du fichier tu gagnes du temps, tu plantes plus tôt.

Par contre tu peux virer cette ligne et générer une exception dans ton constructeur à la place, comme ça si tu te manges une exception tu sais que tu dois charger une autre lib.

Ou alors tout simplement si tu as php 5 ben tu vires la ligne.

C'est pas grave d'avoir des noms de classe longs. Tu peux aussi avoir des noms courts avec les namespaces.

Et sinon je comprends pas le rapport entre ce que tu demandes et quand tu dis avoir 1 classe par fichier. Que toutes tes classes soient dans un dossier unique ou chacune dans sa propre dépendance, si le fichier porte pas le nom de la classe l'autoload ne la trouvera pas, ça ne change rien. Mais comme ce n'est pas ton cas tout va bien.


RE: php __autoload - Xenos - 04-03-2013

(04-03-2013, 05:03 PM)niahoo a écrit : si le fichier porte pas le nom de la classe l'autoload ne la trouvera pas

Cela signifie qu'on ne peut pas avoir 2 classes pour 1 seul fichier, car ce fichier ne peut pas avoir deux noms.
Deux solutions:
- Dire au système d'exploitation de rediriger les appels au fichier ".../classe2.php" vers ".../classe1.php" (classe1.php contient la définition des classes classe1 et classe2)
ou
- Créer un fichier ".../classe2.php" qui contient une ligne:
Code PHP :
<?php include('.../classe1.php'); ?>

Mais dans tous les cas, si le fichier contient deux classes, il ne peut pas utiliser l'auto-load en se basant sur le seul nom des classes, les deux noms de classe étant différents, l'auto-load cherchera 2 fichiers différents, alors qu'il n'y en a qu'un.


RE: php __autoload - niahoo - 04-03-2013

Ben c'est bien ce que j'ai dit. Mais bon il n'a pas ce problème de toute façon.

Mais sinon je n'aime pas tes solutions ... ça sert à quoi ? Tu mets chaque classe dans un fichier bien nommé et pis voilà ... Si ton système est solide tu actives le cache d'opcode (et tu peux même faire une archive .phar pour simplifier le déploiement).