Mam strukturę katalogów podobną do poniższej;
script.php
inc / include1.php
inc / include2.phpobiekty / obiekt1.php
obiekty / obiekt2.phpsoap / soap.php
Teraz używam tych obiektów w obu script.php
i /soap/soap.php
, mógłbym je przenieść, ale chcę mieć taką strukturę katalogów z konkretnego powodu. Podczas wykonywania script.php
ścieżki dołączania jest inc/include.php
i podczas wykonywania /soap/soap.php
jej ../inc
, ścieżki bezwzględne działają, /mnt/webdev/[project name]/inc/include1.php...
ale jest to brzydkie rozwiązanie, jeśli kiedykolwiek chcę przenieść katalog do innej lokalizacji.
Czy jest więc sposób na użycie ścieżek względnych lub sposób na programowe generowanie "/mnt/webdev/[project name]/"
?
DOCUMENT_ROOT
Możesz użyć ścieżek względnych. Spróbuj
__FILE__
. Jest to stała PHP, która zawsze zwraca ścieżkę / nazwę pliku skryptu, w którym się znajduje. Tak więc w programiesoap.php
możesz:Innym rozwiązaniem byłoby ustawienie ścieżki włączania w pliku httpd.conf lub .htaccess.
źródło
/
na początku cytowanej wypowiedzi, aby oddzielić..
od FILE nazwy.__DIR__
zamiast używaniadirname(__FILE__)
. (Dokumentacja PHP)include dirname(__FILE__).'/../inc/include.php';
Nie zapomnij o znaku „/” przed ścieżką względną.Innym sposobem rozwiązania tego problemu, który całkowicie eliminuje potrzebę dołączania, jest użycie funkcji automatycznego ładowania . Uwzględnianie wszystkiego, czego potrzebuje twój skrypt, „na wszelki wypadek” może obniżyć wydajność. Jeśli dołączone są wszystkie definicje klas lub interfejsów i chcesz je załadować tylko w razie potrzeby, możesz przeciążać
__autoload()
funkcję własnym kodem, aby znaleźć odpowiedni plik klasy i załadować go tylko wtedy, gdy jest wywoływany. Oto przykład z instrukcji:Dopóki odpowiednio ustawisz zmienne include_path, nigdy nie będziesz musiał ponownie dołączać pliku klasy.
źródło
zajrzyj na http://au.php.net/reserved.variables
Myślę, że zmienna, której szukasz, to:
$_SERVER["DOCUMENT_ROOT"]
źródło
Możesz zdefiniować stałą ze ścieżką do katalogu głównego projektu, a następnie umieścić ją na początku ścieżki.
źródło
Inną opcją, związaną z Kevinem, jest użycie
__FILE__
, ale zamiast tego zastąp nazwę pliku php z niego:Używam tego od jakiegoś czasu. Jedynym problemem jest to, że czasami nie masz
$_SERVER['SCRIPT_NAME']
, ale czasami jest inna podobna zmienna.źródło
Okazało się, że to działa bardzo dobrze!
Posługiwać się:
źródło
Myślę, że najlepszym sposobem jest umieszczenie dołączeń w ścieżce dołączania PHP. W zależności od konfiguracji można to zrobić na różne sposoby.
Następnie możesz po prostu odnieść się do
z wnętrza dowolnego pliku, niezależnie od tego, gdzie się on znajduje, czy w dołączonych plikach, czy w plikach dostępnych w sieci, czy też na dowolnym poziomie zagnieżdżonych podkatalogów.
Pozwala to na umieszczanie plików dołączanych poza katalogiem głównym serwera WWW, co jest najlepszym rozwiązaniem.
na przykład
Sprawdź również __autoload pod kątem leniwego ładowania plików klas
http://www.google.com/search?q=setting+php+include+path
http://www.google.com/search?q=__autoload
źródło
Używam tej linii kodu. Wraca na „górę” drzewa serwisu, a następnie przechodzi do żądanego pliku.
Na przykład, powiedzmy, że mam to drzewo plików:
Mogę dołączyć plik functions.php z dowolnego miejsca, po prostu kopiując wklej
Jeśli chcesz użyć tego kodu wiele razy, możesz utworzyć funkcję, która zwraca
str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))
część. Następnie wstaw tę funkcję do pierwszego dołączanego pliku. Mam plik „initialize.php”, który umieszczam na samej górze każdej strony php i który zawiera tę funkcję. Następnym razem, gdy będę musiał dołączyć pliki, po prostu używam funkcji (o nazwiepath_back
):źródło
O tak, absolutnie. Na przykład używamy pojedynczej warstwy podfolderów, ogólnie:
Musisz uważać na zbyt duże poleganie na ścieżce dołączania w witrynach o naprawdę dużym ruchu, ponieważ php musi przeszukiwać bieżący katalog, a następnie wszystkie katalogi na ścieżce dołączania, aby zobaczyć, czy twój plik tam jest, a to może spowolnić sprawy, jeśli dostajesz młotek.
Na przykład, jeśli wykonujesz MVC, umieścisz ścieżkę do katalogu swojej aplikacji w ścieżce dołączania, a następnie określ odwołanie do rzeczy w formularzu
lub cokolwiek.
Ale ogólnie rzecz biorąc, po prostu pozwala ci pracować z naprawdę krótkimi ścieżkami w twoim PHP, które będą działać z dowolnego miejsca i jest o wiele łatwiejsze do odczytania niż cały ten malarkey root dokumentu realpath.
Zaletą tych alternatywnych skryptów, które inni sugerowali, jest to, że działają one wszędzie, nawet na współdzielonych skrzynkach; ustawienie ścieżki dołączania wymaga trochę więcej przemyślenia i wysiłku, ale jak wspomniałem, pozwala ci zacząć używać __autoload, które jest po prostu najfajniejsze.
źródło
Jeśli zamierzasz dołączyć określoną ścieżkę do większości plików w aplikacji, utwórz zmienną globalną do folderu głównego.
Teraz ta zmienna globalna „ APPLICATION_PATH ” może zostać użyta do włączenia wszystkich plików zamiast wywoływania funkcji realpath () za każdym razem, gdy dołączasz nowy plik.
DAWNY:
Mam nadzieję, że to pomoże ;-)
źródło