include dirname(__FILE__).'/../../index.php';
jest tutaj najlepszym rozwiązaniem i pozwoli uniknąć większości błędów związanych ze ścieżkami względnymi, które można napotkać w przypadku innych rozwiązań.
Rzeczywiście, spowoduje to, że dołączanie będzie zawsze zależne od pozycji bieżącego skryptu, w którym ten kod jest umieszczony (która lokalizacja jest najprawdopodobniej stabilna, ponieważ definiujesz architekturę aplikacji). Różni się to od zwykłego robienia, include '../../index.php'
które obejmuje wykonywany (nazywany również „wywołującym”) skrypt, a następnie względem bieżącego katalogu roboczego , który będzie wskazywał na skrypt nadrzędny, który zawiera twój skrypt, zamiast rozwiązywania ze ścieżki dołączonego skryptu .
Z dokumentacji PHP:
Pliki są dołączane na podstawie podanej ścieżki do pliku lub, jeśli jej nie podano, określonej ścieżki include_path. Jeśli plik nie zostanie znaleziony w ścieżce include_path, funkcja include w końcu sprawdzi własny katalog skryptu wywołującego i bieżący katalog roboczy przed niepowodzeniem.
Najstarszy post, w którym znalazłem cytowanie tej sztuczki, pochodzi z 2003 roku autorstwa Tapkena .
Możesz przetestować za pomocą następującej konfiguracji:
Utwórz układ taki jak ten:
htdocs
¦ parent.php
¦ goal.php
¦
+---sub
¦ included.php
¦ goal.php
W parent.php
, włóż:
<?php
include dirname(__FILE__).'/sub/included.php';
?>
W sub/included.php
, włóż:
<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>
Wynik podczas uzyskiwania dostępu parent.php
:
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
Jak widzimy, w pierwszym przypadku ścieżka jest rozwiązywana ze skryptu wywołującego parent.php
, podczas gdy za pomocą dirname(__FILE__).'/path'
sztuczki włączanie odbywa się ze skryptu, w included.php
którym znajduje się kod.
Uwaga, poniższy tekst NIE jest odpowiednikiem powyższej sztuczki w przeciwieństwie do tego, co można przeczytać gdzie indziej:
include '/../../index.php';
Rzeczywiście, prepending /
zadziała, ale rozwiąże to tak samo, jak w include ../../index.php
przypadku skryptu wywołującego (różnica polega na tym, include_path
że nie będzie później obsługiwana, jeśli się nie powiedzie). Z dokumentu PHP :
Jeśli zdefiniowano ścieżkę - niezależnie od tego, czy jest to bezwzględna (zaczynająca się od litery dysku lub \ w systemie Windows lub / w systemach Unix / Linux), czy względna w stosunku do bieżącego katalogu (zaczynająca się od. Lub ..) - ścieżka include_path zostanie całkowicie zignorowana.