Mam problem ze zrozumieniem zestawu reguł dotyczących względnych ścieżek dołączania PHP. Jeśli uruchomię plik A.PHP- i plik A.PHP zawiera plik B.PHP, który zawiera plik C.PHP, czy względna ścieżka do C.PHP powinna odnosić się do lokalizacji B.PHP, czy do lokalizacji A .PHP? To znaczy, czy ma znaczenie, z którego pliku jest wywoływane dołączenie, czy tylko jaki jest bieżący katalog roboczy - i co określa bieżący katalog roboczy?
php
include
relative-path
Yarin
źródło
źródło
Odpowiedzi:
Jest względna w stosunku do głównego skryptu, w tym przypadku A.php. Pamiętaj, że
include()
po prostu wstawia kod do aktualnie uruchomionego skryptu.Nie.
Jeśli chcesz, aby miało to znaczenie i wykonaj dołączenie względem B.php, użyj
__FILE__
stałej (lub__DIR__
od PHP 5.2 IIRC), która zawsze będzie wskazywać na dosłowny plik bieżący, w którym znajduje się wiersz kodu.źródło
__DIR__
do tego dokładnego celu.include(dirname(__FILE__)."/C.PHP");
, ponieważinclude("C.PHP");
wystarczy (tak! C.PHP może znajdować się w tym samym katalogu co B.PHP) Może się nie powieść tylko wtedy, gdy w Twoim projekcie są dwa pliki C.PHP.@Pekka mnie tam doprowadził, ale chcę się tylko podzielić tym, czego się nauczyłem:
getcwd()
zwraca katalog, w którym znajduje się plik, który zacząłeś wykonywać.dirname(__FILE__)
zwraca katalog pliku zawierającego aktualnie wykonywany kod.Korzystając z tych dwóch funkcji, zawsze możesz zbudować ścieżkę dołączania względem tego, czego potrzebujesz.
np. jeśli b.php i c.php współdzielą katalog, b.php może zawierać c.php, na przykład:
bez względu na to, skąd dzwoniono do b.php.
W rzeczywistości jest to preferowany sposób ustanawiania ścieżek względnych, ponieważ dodatkowy kod uwalnia PHP od konieczności iteracji po ścieżce include_path podczas próby zlokalizowania pliku docelowego.
Źródła:
Różnica między getcwd () a dirname (__ FILE__)? Którego powinienem użyć?
Dlaczego powinieneś używać dirname (__ FILE__)
źródło
Jeśli ścieżka dołączenia nie zaczyna się od
./
lub../
, na przykład:Jeśli dołączona ścieżka zaczyna się od
./
lub../
, na przykład:Znak
.
lub..
powyżej odnosi się dogetcwd()
, co oznacza domyślną ścieżkę do.php
pliku wejściowego (tjA.php
.).Przetestowano na PHP 5.4.3 (data kompilacji: 8 maja 2012 00:47:34).
(Należy również pamiętać, że
chdir()
może to zmienić wyjściegetcwd()
.)źródło
chdir(__DIR__)
do rozwiązania problemu.getcwd()
, która jest domyślną ścieżką do wpisu pliku .php [...] - niekoniecznie prawda. Jeśli uruchomię PHP w wierszu poleceń, wówczasgetcwd()
odwołuje się do bieżącego katalogu roboczego powłoki, niezależnie od tego, który.php
plik wywołuję. Mogę sobie jednak wyobrazić, że jeśli PHP jest uruchamiane w środowisku serwera WWW, to środowisko inicjuje bieżący katalog roboczy do.php
pliku wejściowego . Testowane na macOS z PHP 7.2.2 zainstalowanym przez Homebrew.Przyjęta odpowiedź Pekki jest niepełna i, w ogólnym kontekście, myląca. Jeśli plik jest podany jako ścieżka względna, wywoływana konstrukcja języka
include
będzie go szukać w następujący sposób.Najpierw przejdzie przez ścieżki zmiennej środowiskowej
include_path
, którą można ustawić za pomocąini_set
. Jeśli to się nie powiedzie, przeszuka katalog własny skryptu wywołującegodirname(__FILE__)
(__DIR__
z php> = 5.3). Jeśli to również się nie powiedzie, tylko wtedy przeszuka katalog roboczy! Po prostu okazuje się, że domyślnie zmienna środowiskowainclude_path
zaczyna się od.
, czyli aktualnego katalogu roboczego. Jest to jedyny powód, dla którego szuka najpierw w bieżącym katalogu roboczym. Zobacz http://php.net/manual/en/function.include.php .Tak więc prawidłowa odpowiedź na pierwszą część pytania jest taka, że ma znaczenie, gdzie znajduje się dołączony skrypt wywołujący. Odpowiedź na ostatnią część pytania jest taka, że początkowy katalog roboczy, w kontekście serwera WWW, jest katalogiem wywoływanego skryptu, skryptu, który zawiera wszystkie pozostałe, podczas gdy jest obsługiwany przez PHP. W kontekście wiersza poleceń początkowy katalog roboczy jest tym, czym jest, gdy php jest wywoływany po znaku zachęty, niekoniecznie katalogiem, w którym znajduje się wywołany skrypt. Bieżący katalog roboczy, jednak może ulec zmianie w czasie wykonywania z funkcji PHP
chdir
. Zobacz http://php.net/manual/en/function.chdir.php .Ten akapit został dodany w celu skomentowania innych odpowiedzi. Niektórzy wspominali, że poleganie na
include_path
jest mniej niezawodne, dlatego lepiej jest używać pełnych ścieżek, takich jak./path
lub__DIR__ . /path
. Niektórzy posunęli się nawet do stwierdzenia, że poleganie na samym katalogu roboczym.
nie jest bezpieczne, ponieważ można go zmienić. Jednak czasami trzeba polegać na wartościach środowiskowych. Na przykład możesz chcieć ustawićinclude_path
pusty, aby katalog skryptu wywołującego był pierwszym miejscem, które będzie przeszukiwał, nawet przed bieżącym katalogiem roboczym. Kod może być już napisany i regularnie aktualizowany ze źródeł zewnętrznych i nie chcesz ponownie wstawiać prefiksu za__DIR__
każdym razem, gdy kod jest aktualizowany.źródło
dirname(__FILE__)
(__DIR__)
z php> = 5.3.)" Czy na pewno? Gdzie to jest udokumentowane? Mam nadzieję, że się mylisz, a PHP nie używa__FILE__
i__DIR__
do tego celu, ponieważ spowodowałoby to natychmiastowe zerwanie dołączania skryptów "rodzeństwa" z dowiązanych symbolicznie ! : -o (Co na szczęście wydaje się działać dobrze tutaj, na mojej konfiguracji 7.1.)Krótka odpowiedź: dotyczy skryptu włączającego.
TFM wyjaśnia to poprawnie:
Tak więc, jeśli /app/main.php mówi,
include("./inc.php")
że znajdzie /app/inc.php ../ nie jest to bezwzględnie konieczne, ale usuwa zależność include_path.
Nie polegałbym na znajdowaniu plików dołączanych w bieżącym katalogu roboczym na wypadek, gdyby ktoś zmienił go za pomocą
chdir()
.źródło
./
, czy najpierw sprawdza on katalog skryptu wywołującego, czy też bieżący katalog roboczy?./
. tzn. chdir ("/ app / other") zakończy sięinclude("./inc.php")
niepowodzeniem. Dlategoinclude("inc.php")
w tym przypadku użyj, aby być bezpiecznym.Aby uwzględnić
a
wb
trzebainclude("../a.php");
Aby uwzględnić
b
wc
trzebainclude("dir2/b.php");
źródło