function __autoload($className)
{
if (!class_exists($className, false))
require_once(dirname(__FILE__).'/../classes/'.$className.'.php');
}
Quelques précisions :
- Il s'agit de la fonction d'
autoloading
d'un projet français qui a le vent en poupe. - Il y a deux paradoxes.
[EDIT 1] Il y a des développeurs qui savent encore réfléchir, au vu des commentaires que je recois.
[EDIT 2] Il y a aussi des développeurs
qui ne savent pas réfléchir.
31 réactions
1 De parweb - 13/10/2009, 13:45
1 - le if class_exists est inutile car si on se sert dune classe s'est parce qu'on sait quel existe.
2 - peut être le bout de chemin dirname(__FILE__).'/../classes/
j'aurai plutôt mi directement le chemin exacte
enfin je suis pas sur mais voila mon avis :p
2 De mvachette - 13/10/2009, 13:57
- si la fonction autoload est appelée, c'est que forcément la classe n'existe pas.. donc pas besoin de faire le test.
- si la classe n'existe pas, c'est qu'a priori le fichier la définissant n'a jamais été inclu, donc pas besoin de faire un require_once, un require suffirait
3 De zeus - 13/10/2009, 14:07
Le fait de tester l'existence de la classe rend inutile le require_once(), un simple require fonctionnerais correctement.
Le second paradoxe doit tenir dans le second paramètre de la méthode class_exists(), mais comme je ne l'ai que rarement utilisé, je ne m'avancerais pas trop là dessus.
4 De SamRay1024 - 13/10/2009, 14:10
Aller, je tente ma chance
1er paradoxe : ne faudrait-il pas mieux vérifier si la classe existe bien après l'inclusion du fichier ?
2e : le require_once n'est pas forcément nécessaire vu que l'autoload n'est exécuté qu'une seule fois ; aucun risque d'inclure le fichier une 2e fois...sauf si des inclusions manuelles sont faites.
5 De pat - 13/10/2009, 14:17
Je vois pas trop, le nom de dossier "classes" ( à la française) ?? le fichier de la class qui ne finit pas par .class.php ?? Pour faire ça il devrait utiliser Zend_loader avec le systeme de dossier underscore franchement !!!
6 De mageekguy - 13/10/2009, 14:22
@pat :
Oui, hein, franchement, ils sont vraiment nuls, d'autant que cela permettrai de gréver encore plus les performances...
Pour information, pat, tu n'est pas du tout sur la bonne piste, et le Zend Framework n'est pas la panacée.
7 De flo - 13/10/2009, 14:35
le fait d'appeller class_exists dans l'autoload ?
si __autoload est appellé c'est que la classe n'existe pas donc le if est toujours vrai a priori.
8 De max - 13/10/2009, 14:41
1/ L'autoload ne se lance que si la classe n'existe pas, le test "class_exists" est donc stupide
2/ Euh... utiliser dirname(__FILE__) au lieu de __DIR__ ?
9 De Stopher - 13/10/2009, 15:07
Tester la définition d'une classe dans un autoload , sans rien avant ne sert à rien si je ne m'abuse ..
Car si __autoload est appelé , c'est bien que la définition de la classe appelé n'existe pas encore .
A la limite , mettre le require_once avant le test permet de savoir si le fichier chargé contient bien la définition de la classe voulue (" require() " aurait suffit d'ailleurs ) , si ce n'est pas le cas alors lancer un exception comme présenté dans la doc .
http://php.net/manual/fr/function.c...
Bref pour moi , je ne vois pas de logique dans cette méthode.
Maintenant , je suis peut être à coté ... il faut dire que parfois .. souvent les développeurs ont un esprit tordu ... moi le premier
10 De Jérémy - 13/10/2009, 15:15
A vue de nez, je dirais, qu'un test de class_exists dans un __autoload, avant l'include, est inutile, car si on demande a charger la class, c'est que forcement qu'elle n'existe pas. En revanche, il pourrait avoir son utilité après l'include pour vérifier que l'include a bien fonctionné comme on l'attendait.
On pourrait s'interroger également sur l'utilité du _once de require_once. Si on inclue pas le fichier ailleurs (a la mano) et si le fichier inclu contient bien la class à loadeer, l'__autoload ne doit être appelé qu'une seule fois et donc l'include aussi
dirname(__FILE__) pourrait être assez couteux, et, en php 5.3 on aurait remplacé par __DIR__ , mais je suppose que ce projet est compatible avec des version antérieur de php. Dans ce cas, j'aurais déclaré une variable unique avec mon __autoload (lui aussi déclaré une seule fois) pour avoir un chemin vers mon projet du genre define( '__PROJECT__', dirname(__FILE__).'/../'); ce qui evite d'avoir des dirname(__FILE__) à tous les coins de rue.
D'ailleurs de quel projet s'agit-il ?
11 De Ishiro - 13/10/2009, 15:38
L'autoloading se fait si la classe n'a pas déjà été définie... La fonction class_exists ne sert à rien si ce n'est à amoindrir les performances, de même un simple require (plus performant que require_once) suffit.
Par contre, la doc utilise aussi un require_once dans l'exemple #1, il y a peut être quelque chose qui m'échappe...
Il vient d'où ce morceau de code ? Ce ne serait pas une application dont le nom commence et se termine par un P ?
12 De Hyvs - 13/10/2009, 15:52
A mon tour d'essayer, __autoload est appelé seulement si la classe n'est pas définie. La condition est donc inutile. Je serais plutôt d'avis de faire l'include et après seulement tester l'existence de ma classe et dans le cas échéant prévoir une routine de secours ou une levée d'exception.
Mea culpa si complètement à coté
De quel projet francophone s'agit-il ?
13 De Syndrael - 13/10/2009, 16:16
Euh.. le class_exists ?? perso j'en vois pas l'utilité. Et je reconnais que d'habitude je Catch l'ensemble.
Mais dans la mesure où mon code est assez clair je vois pas l'utilité de l'autoload..
S.
14 De fgallnii - 13/10/2009, 16:24
1: Quel est l'intérêt de tester l'existence de la classe puisque si PHP appelle "__autoload" c'est qu'elle n'existe pas ??
2: Pourquoi demander à PHP de vérifier si la classe est déjà incluse avec "require_once", puisqu'encore une fois à ce moment là, la classe n'existe pas...
C'est les paradoxes auxquels tu penses ?? Sinon j'en vois pas d'autres.
A+
15 De Ldo - 13/10/2009, 16:24
1 le test qui n'a pas d'intérêt, si autoload est apppelé c'est que la classe n'existe pas pas besoin de le tester à nouveau et 2 le paramètre autoload de class_exists à false ...
16 De Niaatan - 13/10/2009, 16:25
On dirait que mettre un test d'existence d'une classe DANS l'autoloader (qui est appelé en cas de non existance de la classe) est pas super pertinant, non ?
17 De Yosh - 13/10/2009, 16:36
euh, je dirais que l'autoload émule en soit l'appel de la méthode class_exists, donc aucun intérêt d'appeler cette méthode ^^
18 De Fabien - 13/10/2009, 17:05
Premier paradoxe, je dirais que, à priori, si la fonction __autoload est invoquée c'est que la classe n'existe pas donc la condition if ne sert pas à grand chose.
Ensuite, le require_once devrait plutôt être un require. Une fois la classe chargée, on ne reviendra plus dans la fonction __autoload pour la classe en question. Le "_once" ne sert donc pas à grand chose à part impacter les performances.
19 De Mat - 13/10/2009, 17:17
J'en vois un : le test inutile du class_exists() pour vérifier que la classe n'est pas définie alors que l'autoload est appelé spécifiquement dans ce cas.
Pour le 2eme... je pencherais sur l'utilité de l'utilisation du require"_once()". Mais faut voir le reste du projet, il pourrait etre justifiable dans certains cas.
20 De Xarch - 13/10/2009, 17:57
Bah c'est simple, si la fonction __autoload est appelé, la classe n'existe pas, donc inutile d'utilise class_exists.
21 De jp.fox - 13/10/2009, 18:06
A mon avis :
1- il est inutile de tester l'existence de la classe dans la fonction autoload car si cette fonction est appelée, c'est que la classe n'existe pas.
2- Il est aussi inutile de tester si la classe existe si on la charge avec un require_once car ce dernier vérifie que le fichier n'a pas déjà été inclus (à condition que ma définition de la classe soit uniquement dans un fichier, ce qui est un postulat acceptable)
L'autoload n'est pas génial en terme de perf, mais là ça aide vraiment pas.
22 De EnZ - 13/10/2009, 19:08
je dirais qu'il manque realpath() pour l'include, et ensuite le require_once est inutile puisque il verifie si la classe exist. require_once "inclut" le fichier tout en verifiant que le contenu n'a pas été chargé, ou un truc dans le genre. (je suis qu'un autodidacte pardonnez moi ^^)
Peace
23 De pluriels - 13/10/2009, 20:48
je me lance :
- si je suis dans autoload, c'est que la classe n'existe pas ?
- dirname(__FILE__).'/../classes/'.$className.'.php')
L'utilisation de dirname avec juste après "/../", c'est bizarre non ?
Et quel est ce framework de compétition ?
24 De Pascal MARTIN - 13/10/2009, 22:12
Tester dans une fonction d'autoload, appelée seulement pour une classe non trouvée, si la classe existe ?
Ce qui signifierait :
- appel inutile à class_exists : renverra toujours false (d'autant plus que le second paramètre est à false)
- et j'ajouterai que le require_once pourrait être transformé en require tout court
Ou il y a autre chose ? ^^
25 De thom - 14/10/2009, 09:00
Moi je dirais bien, que la classe ainsi définie, n'est pas chargée. Au contraire, si la classe n'est pas définie, on inclue le fichier contenant la dîtes classe.... bizarre!
26 De Arkh - 14/10/2009, 09:25
1/ Autoload n'est appelé que si la classe n'existe pas : pas besoin de tester si elle existe.
2/ Pas besoin d'utiliser require_once non plus : si la classe n'existe pas, c'est que le fichier n'a jamais été inclu. Bon, on peut imaginer que le fichier inclu est mal branlé et peut ne pas définir la classe. Mais à ce point là, c'est que beaucoup de choses déconnent.
27 De petitchevalroux - 14/10/2009, 11:19
Euh je comprends pas trop l'interet de commenter 500 fois avec les mêmes réponses : C'est un concourt de SEO pour placer un max d'autoload et de class_exists dans la page ou quoi ? :D
28 De mageekguy - 14/10/2009, 12:09
@petitchevalroux :
Tu arrives après la bataille, c'est pourquoi il y a toujours quasiement le même commentaire.
Chaque lecteur intéressé a laissé un commentaire, et j'ai tout publié en même temps.
29 De petitchevalroux - 14/10/2009, 13:52
Autant pour moi, en tout cas même si les comm' sont fastidieux à lire je trouve l'idée du code review plutôt sympa et si ça peut faire avancer le schmilblick tant mieux :D
30 De Stopher - 14/10/2009, 14:01
Oui mais maintenant , nous voulons le mot de la fin
Y avait-il autre chose à dire ?
Ch.
31 De mageekguy - 14/10/2009, 16:27
@Stopher :
C'est par la que cela se passe.