J'ai une structure de répertoires comme celle-ci;
script.php
inc / include1.php
inc / include2.phpobjets / object1.php
objets / object2.phpsavon / savon.php
Maintenant, j'utilise ces objets dans les deux script.php
et /soap/soap.php
, je pourrais les déplacer, mais je veux la structure de répertoire comme ça pour une raison spécifique. Lors de l' exécution script.php
du include_path est inc/include.php
et lors de l' exécution , /soap/soap.php
il est ../inc
, le travail de chemins absolu, /mnt/webdev/[project name]/inc/include1.php...
mais il est une solution laide si je veux jamais déplacer le répertoire vers un autre emplacement.
Existe-t-il donc un moyen d'utiliser des chemins relatifs, ou un moyen de générer par programme le "/mnt/webdev/[project name]/"
?
DOCUMENT_ROOT
Vous pouvez utiliser des chemins relatifs. Essayez
__FILE__
. C'est une constante PHP qui retourne toujours le chemin / nom de fichier du script dans lequel il se trouve. Donc, danssoap.php
, vous pouvez faire:Une autre solution serait de définir un chemin d'inclusion dans votre httpd.conf ou dans un fichier .htaccess.
la source
/
au début de l'expression citée, pour séparer le..
du nom FILE .__DIR__
plutôt que d'avoir à utiliserdirname(__FILE__)
. (Documentation PHP)include dirname(__FILE__).'/../inc/include.php';
N'oubliez pas le "/" avant le chemin relatif.Une autre façon de gérer cela qui supprime tout besoin d'inclusion est d'utiliser la fonction de chargement automatique. Inclure tout ce dont votre script a besoin "Just in Case" peut nuire aux performances. Si vos inclusions sont toutes des définitions de classe ou d'interface et que vous souhaitez les charger uniquement lorsque cela est nécessaire, vous pouvez surcharger la
__autoload()
fonction avec votre propre code pour trouver le fichier de classe approprié et le charger uniquement lorsqu'il est appelé. Voici l'exemple du manuel:Tant que vous définissez vos variables include_path en conséquence, vous n'aurez plus jamais besoin d'inclure à nouveau un fichier de classe.
la source
jetez un œil à http://au.php.net/reserved.variables
Je pense que la variable que vous recherchez est:
$_SERVER["DOCUMENT_ROOT"]
la source
Vous pouvez définir une constante avec le chemin d'accès au répertoire racine de votre projet, puis la placer au début du chemin.
la source
Une autre option, liée à celle de Kevin, est d'utiliser
__FILE__
, mais à la place de remplacer le nom du fichier php à l'intérieur:J'utilise ça depuis un moment. Le seul problème est que parfois vous n'en avez pas
$_SERVER['SCRIPT_NAME']
, mais parfois il y a une autre variable similaire.la source
J'ai trouvé que cela fonctionnait très bien!
Utilisation:
la source
Je pense que le meilleur moyen est de mettre vos includes dans votre chemin d'inclusion PHP. Il existe différentes façons de procéder en fonction de votre configuration.
Ensuite, vous pouvez simplement vous référer à
de l'intérieur de n'importe quel fichier, peu importe où il se trouve, que ce soit dans vos fichiers inclus ou accessibles sur le Web, ou à tout niveau de sous-répertoires imbriqués.
Cela vous permet d'avoir vos fichiers d'inclusion en dehors de la racine du serveur Web, ce qui est une bonne pratique.
par exemple
Consultez également __autoload pour le chargement paresseux des fichiers de classe
http://www.google.com/search?q=setting+php+include+path
http://www.google.com/search?q=__autoload
la source
J'utilise cette ligne de code. Il remonte en "haut" de l'arborescence du site, puis va au fichier souhaité.
Par exemple, disons que j'ai cette arborescence de fichiers:
Je peux inclure le fichier functions.php où que je sois, simplement en copiant-collant
Si vous devez utiliser ce code plusieurs fois, vous pouvez créer une fonction qui renvoie la
str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))
pièce. Ensuite, insérez simplement cette fonction dans le premier fichier que vous incluez. J'ai un fichier "initialize.php" que j'inclus tout en haut de chaque page php et qui contient cette fonction. La prochaine fois que je dois inclure des fichiers, j'utilise en fait simplement la fonction (nomméepath_back
):la source
Oh oui, absolument. Ainsi, par exemple, nous utilisons une seule couche de sous-dossiers, généralement:
Vous devez faire attention à ne pas trop vous fier au chemin d'inclusion dans les sites à très fort trafic, car php doit parcourir le répertoire actuel, puis tous les répertoires sur le chemin d'inclusion afin de voir si votre fichier est là et cela peut ralentir les choses se passent si vous êtes martelé.
Donc, par exemple, si vous faites MVC, vous mettez le chemin de votre application directoy dans le chemin d'inclusion, puis spécifiez faire référence aux choses dans le formulaire
ou peu importe.
Mais d'une manière générale, cela vous permet simplement de travailler avec des chemins vraiment courts dans votre PHP qui fonctionneront de n'importe où et c'est beaucoup plus facile à lire que tout ce malarkey de racine de document realpath.
L'avantage de ces alternatives basées sur des scripts que d'autres ont suggérées est qu'elles fonctionnent n'importe où, même sur des boîtes partagées; définir le chemin d'inclusion nécessite un peu plus de réflexion et d'efforts, mais comme je l'ai mentionné, vous permet de commencer à utiliser __autoload, ce qui est juste le plus cool.
la source
Si vous prévoyez d'inclure un chemin d'accès spécifique dans la plupart des fichiers de votre application, créez une variable globale dans votre dossier racine.
Maintenant, cette variable globale " APPLICATION_PATH " peut être utilisée pour inclure tous les fichiers au lieu d'appeler realpath () chaque fois que vous incluez un nouveau fichier.
EX:
J'espère que ça aide ;-)
la source