124 votes

Sont inclus de PHP avec un chemin relatif vers le fichier ou le code d'appel?

Je vais avoir de la difficulté à comprendre le jeu de règles concernant le PHP par rapport chemins à inclure. Si je lance le fichier A.PHP - et fichier A.PHP inclut le fichier B.PHP qui inclut le fichier C.PHP si le chemin d'accès relatif à C.PHP dans le cas de l'emplacement de B.PHP ou à l'emplacement de A.PHP? C'est, importe-t-il qui fichier include est appelé à partir, ou seulement ce que le répertoire de travail actuel est - et qu'est ce qui détermine le répertoire de travail actuel?

143voto

Pekka 웃 Points 249607

Il est relatif au script principal, dans ce cas A.php. Rappelez-vous que include() seulement insère le code dans le script en cours d'exécution.

C'est, n'importe quel fichier include est appelé à partir de

Pas de.

Si vous voulez faire ce qu'il importe, et de faire un include par rapport à B.php, utiliser l' __FILE__ constant (ou __DIR__ depuis PHP 5.2 IIRC) qui pointe toujours à la traduction littérale du fichier courant que la ligne si le code est situé dans.

include(dirname(__FILE__)."/C.PHP");

26voto

Yarin Points 18186

@Pekka m'a mis là, mais juste envie de partager ce que j'ai appris:

getcwd() renvoie le répertoire où le fichier que vous avez lancé l'exécution réside.

dirname(__FILE__) renvoie le répertoire du fichier contenant le code en cours d'exécution.

À l'aide de ces deux fonctions, vous pouvez toujours construire un chemin d'inclusion par rapport à ce dont vous avez besoin.

par exemple, si b.php et c.php partager un répertoire, b.php peut inclure c.php comme:

include(dirname(__FILE__).'/c.php');

n'importe où b.php a été appelé à partir.

En fait, c'est la meilleure façon d'établir des chemins relatifs, comme le code supplémentaire libère PHP d'avoir à parcourir l'include_path dans la tentative de localiser le fichier cible.

Sources:

Différence Entre getcwd() et dirname(__FILE__) ? Qui dois-je utiliser?

Pourquoi devriez-vous utiliser dirname(FICHIER)

19voto

Johnny Wong Points 96
  1. Si le chemin ne commence pas par './' ou '../', comme

    inclure "C.php'; // priorité: include_path (qui comprennent les '.' au premier abord), puis le chemin du courant .fichier php (B.php), puis '.'

  2. Si le chemin commence par './' ou '../', comme

    include './C.php'; // par rapport à '.'

    include '../C.php'; // aussi par rapport à '.'

Le". " ou " .. " ci-dessus est par rapport à getcwd(), qui par défaut sur le chemin de l'entrée .fichier php (A.php) (changement de pouvoir par chdir())

Testé sur PHP 5.4.3 (Build Date : 8 Mai 2012 à 00:47:34 )

6voto

Denis Howe Points 315

Réponse courte: c'est par rapport à la dont le script.

TFM explique correctement:

Si le fichier n'est pas trouvé dans l'include_path inclure va vérifier dans le script d'appel du répertoire et le répertoire de travail courant

Donc, si /app/main.php dit - include("./inc.php") qui vous permettra de trouver /app/inc.php.

L' ./ n'est pas strictement nécessaire, mais supprime la dépendance de l'include_path.

Je ne voudrais pas compter sur la recherche d'inclure les fichiers dans le répertoire de travail actuel dans le cas où quelqu'un change avec chdir().

-2voto

Olli Points 655
dir
-> a.php
-> c.php

- dir2 
-> b.php

Pour inclure a en b vous avez besoin d' include("../a.php");

Pour inclure b en c vous avez besoin d' include("dir2/b.php");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X