J'ai du mal à comprendre le jeu de règles concernant les chemins d'inclusion relatifs PHP. Si j'exécute le fichier A.PHP- et que le fichier A.PHP inclut le fichier B.PHP qui inclut le fichier C.PHP, le chemin relatif de C.PHP doit-il être en relation avec l'emplacement de B.PHP, ou avec l'emplacement de A .PHP? Autrement dit, quel est le fichier à partir duquel l'inclusion est appelée ou quel est le répertoire de travail actuel et qu'est-ce qui détermine le répertoire de travail actuel?
php
include
relative-path
Yarin
la source
la source
Réponses:
C'est relatif au script principal, dans ce cas A.php. N'oubliez pas que le
include()
code insère simplement dans le script en cours d'exécution.Non.
Si vous voulez que ce soit important, et faire une inclusion relative à B.php, utilisez la
__FILE__
constante (ou__DIR__
depuis PHP 5.2 IIRC) qui pointera toujours vers le fichier courant littéral dans lequel se trouve la ligne de code.la source
__DIR__
dans ce but précis.include(dirname(__FILE__)."/C.PHP");
, car celainclude("C.PHP");
suffit (Oui! C.PHP peut être dans le même répertoire que B.PHP) Cela peut échouer uniquement lorsqu'il y a deux fichiers C.PHP dans votre projet.@Pekka m'a amené là-bas, mais je veux juste partager ce que j'ai appris:
getcwd()
renvoie le répertoire dans lequel réside le fichier que vous avez commencé à exécuter.dirname(__FILE__)
renvoie le répertoire du fichier contenant le code en cours d'exécution.En utilisant ces deux fonctions, vous pouvez toujours créer un chemin d'inclusion relatif à ce dont vous avez besoin.
par exemple, si b.php et c.php partagent un répertoire, b.php peut inclure c.php comme:
peu importe d'où b.php a été appelé.
En fait, c'est la manière préférée d'établir des chemins relatifs, car le code supplémentaire libère PHP de la nécessité d'itérer à travers le include_path pour tenter de localiser le fichier cible.
Sources:
Différence entre getcwd () et dirname (__ FILE__)? Lequel dois-je utiliser?
Pourquoi utiliser dirname (__ FILE__)
la source
Si include path ne commence pas par
./
ou../
, par exemple:Si include path commence par
./
ou../
, par exemple:Le
.
ou..
au-dessus est relatif àgetcwd()
, qui par défaut est le chemin du.php
fichier d' entrée (c.-à-d.A.php
).Testé sur PHP 5.4.3 (Date de build: 8 mai 2012 00:47:34).
(Notez également que cela
chdir()
peut changer la sortie degetcwd()
.)la source
chdir(__DIR__)
à résoudre le problème.getcwd()
, qui par défaut est le chemin du fichier .php d'entrée [...] - pas nécessairement vrai. Si j'exécute PHP sur la ligne de commande,getcwd()
fait référence au répertoire de travail actuel du shell, quel que soit le.php
fichier que j'appelle. Je peux imaginer, cependant, que si PHP est exécuté dans un environnement de serveur Web, l'environnement initialise le répertoire de travail actuel dans le.php
fichier d' entrée . Testé sur macOS avec PHP 7.2.2 installé via Homebrew.La réponse acceptée de Pekka est incomplète et, dans un contexte général, trompeuse. Si le fichier est fourni comme chemin relatif, la construction de langage appelée
include
le recherchera de la manière suivante.Tout d'abord, il passera par les chemins de la variable d'environnement
include_path
, qui peut être définie avecini_set
. Si cela échoue, il cherchera dans le propre répertoire du script appelantdirname(__FILE__)
(__DIR__
avec php> = 5.3.) Si cela échoue également, alors seulement il cherchera dans le répertoire de travail! Il s'avère simplement que, par défaut, la variable d'environnementinclude_path
commence par.
, qui est le répertoire de travail actuel. C'est la seule raison pour laquelle il recherche d'abord dans le répertoire de travail actuel. Voir http://php.net/manual/en/function.include.php .Donc, la bonne réponse à la première partie de la question est qu'il importe où se trouve le script d'appel inclus. La réponse à la dernière partie de la question est que le répertoire de travail initial , dans un contexte de serveur web, est le répertoire du script appelé, le script qui inclut tous les autres tout en étant manipulé par PHP. Dans un contexte de ligne de commande, le répertoire de travail initial est ce qu'il est lorsque php est appelé à l'invite, pas nécessairement le répertoire où se trouve le script appelé. Le répertoire de travail actuel , cependant, peut être modifié au moment de l'exécution avec la fonction PHP
chdir
. Voir http://php.net/manual/en/function.chdir.php .Ce paragraphe est ajouté pour commenter d'autres réponses. Certains ont mentionné que s'appuyer sur
include_path
est moins robuste et qu'il est donc préférable d'utiliser des chemins complets tels que./path
ou__DIR__ . /path
. Certains sont allés jusqu'à dire que se fier au répertoire de travail.
lui-même n'est pas sûr, car il peut être modifié. Cependant, parfois, vous devez vous fier aux valeurs d'environnement. Par exemple, vous pouvez vouloir définirinclude_path
vide, de sorte que le répertoire du script appelant soit le premier endroit où il effectuera la recherche, même avant le répertoire de travail actuel. Le code peut être déjà écrit et mis à jour régulièrement à partir de sources externes et vous ne souhaitez pas réinsérer le préfixe__DIR__
chaque fois que le code est mis à jour.la source
dirname(__FILE__)
(__DIR__)
avec php> = 5.3.)" Êtes-vous sûr? Où est-il documenté? J'espère que vous avez tort, et PHP ne pas utiliser__FILE__
et__DIR__
à cette fin, car cela briser rapidement , y compris les scripts de « frères et sœurs » de liens symboliques les! : -o (Ce qui, heureusement, semble fonctionner correctement ici, sur ma configuration 7.1.)Réponse courte: c'est relatif au script d'inclusion.
TFM l' explique correctement:
Donc, si /app/main.php dit
include("./inc.php")
cela trouvera /app/inc.php .le ./ n'est pas strictement nécessaire mais supprime toute dépendance sur include_path.
Je ne me fierais pas à la recherche de fichiers d'inclusion dans le répertoire de travail actuel au cas où quelqu'un le changerait avec
chdir()
.la source
./
, vérifie-t-elle d'abord le répertoire du script appelant ou le répertoire de travail actuel?./
. ie chdir ("/ app / other") ferainclude("./inc.php")
échouer. Ainsi, utilisezinclude("inc.php")
pour être en sécurité dans ce cas.À inclure
a
dansb
vous devezinclude("../a.php");
Pour inclure
b
dansc
vous devezinclude("dir2/b.php");
la source