a écrit :
This expression - dirname(__FILE__) - is used in a real lot of places. The reason is simple - libraries want to include files relative to library top directory, and do not want to count on include path. And relative include resolution rules in PHP not clear to all, so people prefer to be sure. The downside here is that this expression is dynamic - executed at run-time. Meaning it’s slower and less toolable and also makes a bad habit of putting dynamic things into include (which is not a problem here, since it’s “static dynamic” thing, but still a bad habit).
Je penses que cette personne a faux sur toute la ligne.
L'idée derrière l'utilisation de dirname(__FILE__) est de faire un code portable. Dans ce cas on part du principe que l'on ne connaît pas le chemin absolu vers le script, il est donc impossible de le coder en dur dans l'include_path ou dans une constante.
Pourquoi ne pas utiliser le chemin relatif dans l'include alors ? Tout simplement parce que celui-ci est relatif au fichier exécuté et non au fichier courant, ce qui signifie que si quelqu'un souhaite intégrer notre script dans un autre toute l'architecture est par terre.
Ensuite reste le choix d'utiliser une constante ou ajouter dynamiquement notre chemin à l'include_path (ou l'écriture à chaque include mais ça effectivement c'est stupide). La deuxième solution est plus lente mais elle présente l'avantage d'être plus propre.
Quand à dire qu'il ne faut pas mettre de variable dans un include, oui et non. Certes c'est un risque et la plupart des gens qui le font ne prennent aucune précaution (nombreux exemples sur ce forum). Cependant si l'on veut faire une application un tantinet avancée cela devient vite indispensable et si l'on prend la peine de sécuriser les variables utilisées il n'y a pas de problèmes.
Pour $_SERVER['DOCUMENT_ROOT'] je ne disais pas de l'utiliser comme chemin absolu système mais pour déterminer le chemin absolu sur le web.
Exemple:
$cheminSys = '/var/www/site1/truc/monphp/';
$_SERVER['DOCUMENT_ROOT'] = '/var/www/site1/';
Dans ce cas:
$cheminWeb = '/truc/monphp/';
(différence des deux)
Cela marche dans la plupart des cas, sauf si le fichier se trouve hors de la zone accessible par le web.
À propos de l'utilisation d'une URL dans un include, je le répète, c'est extrêmement lent, coûteux et surtout parfaitement inutile si le script est sur la même machine. Voir la
documentation php à propos d'include pour les mécanismes d'inclusion de fichiers distants.
PS: après avoir lu l'article complet que tu cite, je penses toujours qu'il a tord par rapport aux raisons de l'utilisation d'un tel mécanisme (il semble sous-entendre que c'est par manque de connaissance du php). Par contre sa proposition de constante __FILEDIR__ est intéressante.