2012-05-03 3 views
13

J'ai été partout sur Internet pour essayer de trouver la meilleure façon de gérer les chemins de mon site Web. Dois-je utiliser des chemins relatifs, des chemins absolus?Meilleure pratique pour les chemins PHP

J'ai vu dirname (FICHIER) mentionné plusieurs fois. Un problème que j'ai avec les chemins relatifs est que les fichiers php qui sont inclus par plusieurs autres fichiers à différents niveaux de répertoire provoquent la rupture des chemins relatifs. Par exemple, si la structure du répertoire est

Root 
    A 
    B 
     b 

Et un fichier php dans b et A inclure un autre fichier de B alors les chemins relatifs pour le code dans le fichier B sera différent. Désolé si cela est déroutant, j'ai du mal à taper ce que j'essaie de dire.

Donc, en général, quelle est la meilleure façon de gérer les chemins d'accès aux fichiers en ce qui concerne les opérations d'inclusion et de fichier dans le code.

Merci Vous

+0

C'est le problème avec "Best" n'importe quoi, c'est presque toujours subjectif. –

Répondre

0

Vous pouvez mettre tous vos fichiers à inclure dans un répertoire principal. Créez ensuite une variable de chemin dans un fichier de configuration ou dans le script lui-même, qui pointe vers le répertoire include.

+0

Cela fonctionnerait, mais cela casse mon organisation. J'essaye de garder mes fichiers dans une structure de répertoire logique parce qu'il y en a tellement. – Nath5

-1

Nouvelle version de PHP (PHP5.3) est possible d'utiliser __autoload Ainsi, vous avez juste besoin de déterminer la racine de votre application.

+0

Est-ce que le chargement automatique scanne le chemin du répertoire de manière récursive, et si c'est le cas, cela semble mauvais pour les performances. Aussi, il semble que le chargement automatique ne fonctionne que pour les classes, certains de mes fichiers ne sont pas OO. – Nath5

0

La meilleure façon d'utiliser les conventions de dénomination appropriées pour la structure des répertoires, fichiers PHP et noms de classe du fichier et la conception d'un chargeur automatique pour inclure le fichier

+0

Avez-vous de bons liens vers des exemples de création et de chargement automatique, je suis assez nouveau sur php et n'ai pas encore trouvé un bon tutoriel. – Nath5

+0

http://php.net/manual/fr/language.oop5.autoload.php –

+0

Merci, j'ai lu ça mais cela ne semble fonctionner que pour OO, certains de mes fichiers ne sont pas OO donc je devine que cette méthode a gagné ' t travail. – Nath5

10

Tho il y a plusieurs façons de trouver le chemin que je toujours trouver le plus facile de définir une constante dans un fichier sur la racine du projet index.php ou un config de tri. puis je peux utiliser SITE_ROOT pour les chargeurs inclus/classe ect, et SITE_URL pour les vues, les contrôleurs, les redirections ect.

<?php 
$root=pathinfo($_SERVER['SCRIPT_FILENAME']); 
define ('BASE_FOLDER', basename($root['dirname'])); 
define ('SITE_ROOT', realpath(dirname(__FILE__))); 
define ('SITE_URL', 'http://'.$_SERVER['HTTP_HOST'].'/'.BASE_FOLDER); 
?> 

Basic class Autoloader

<?php 
function __autoload($class_name) { 
    include (SITE_ROOT.'/includes/'.$class_name.'.php'); 
} 
$obj = new MyClass1(); 
$obj2 = new MyClass2(); 
?> 
+0

Avec cette méthode, tous les fichiers qui utiliseront l'autochargeur ne doivent pas nécessairement inclure le fichier de configuration. Si tel est le cas, le meilleur moyen de le faire est d'utiliser un chemin relatif comme include ('../../ config.php'); Aussi comme je l'ai mentionné ci-dessus, ce travail, sinon tous les fichiers sont OO – Nath5

+0

définir les constantes dans votre fichier d'index, il suffit de pointer vers votre racine, si votre config est dans la racine, alors tout ce que vous devez faire est include (SITE_ROOT . '/ config.php') 'quelle que soit la profondeur de votre appel, elle inclura toujours le même fichier. le '__autoload' ne fonctionne que lors de l'appel de classes, il sauve en faisant' include (SITE_ROOT. '/ includes /'.$ class_name.'. php '); 'pour chaque classe, c'est très pratique pour les modèles dans un modèle MVC en tant que contrôleur est normalement appelé de la classe du routeur/contrôleur frontal –

+2

Je ne comprends pas très bien comment cela résout mon problème. Même si j'ai ce niveau de configuration dans ma racine, alors il doit toujours être inclus en utilisant des chemins relatifs par tous mes autres fichiers. Un exemple des problèmes que j'ai est que j'ai une classe ErrorReporter qui est incluse par tous mes autres fichiers qui résident à différents niveaux avec dans la structure du répertoire. A l'intérieur de la classe ErrorReporter, j'ai des chemins mais s'ils sont relatifs ils deviennent relatifs à n'importe quelle classe, y compris ErrorReporter ce qui signifie qu'ils ne sont pas relatifs au même endroit à chaque fois. – Nath5

0

Zend Framework a quelques bons pointeurs sur l'optimisation d'inclure les chemins:

http://framework.zend.com/manual/1.10/en/performance.classloading.html

Même si vous n'êtes pas en utilisant le framework Zend, ces sont de bons indicateurs. Les bulletpoints généraux sont les suivants:

  • Utilisez des chemins absolus
  • Réduire le nombre de chemins à inclure
  • Définir le dossier courant, ou pas du tout
  • Définir votre Zend Framework le plus tôt possible (pas vraiment pertinent si vous n'utilisez pas Zend)
Questions connexes