Jak dołączyć pliki PHP, które wymagają ścieżki bezwzględnej?
Mam strukturę katalogów jak poniżej;
Skrypt.php
Include1.php
include2.phpObiekty / object1.php
obiekty / object2.phpMydło / Mydło.php
Teraz, używam tych obiektów w script.php
i /soap/soap.php
, mógłbym je przenieść, ale chcę taką strukturę katalogów z konkretnego powodu. Podczas wykonywania script.php
ścieżka include to inc/include.php
, a podczas wykonywania {[1] }to ../inc
, ścieżki absolutne działają, /mnt/webdev/[project name]/inc/include1.php...
ale jest to brzydkie rozwiązanie, jeśli kiedykolwiek chcę przenieść katalog w inne miejsce.
Czy jest jakiś sposób na użycie ścieżek względnych, czy też sposób na programowe wygenerowanie "/mnt/webdev/[project name]/"
?
11 answers
To powinno zadziałać
$root = realpath($_SERVER["DOCUMENT_ROOT"]);
include "$root/inc/include1.php";
Edit: dodany przez aussieviking
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:20
Można używać ś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. Więc w soap.php
możesz zrobić:
include dirname(__FILE__).'/../inc/include.php';
Pełna ścieżka i nazwa pliku plik. W przypadku użycia wewnątrz include, zwracana jest nazwa dołączonego pliku. Od PHP 4.0.2,
__FILE__
zawsze zawiera ścieżkę bezwzględną z dowiązania symboliczne rozwiązane natomiast w starszych wersje zawierały ścieżkę względną w pewnych okolicznościach. (źródło)
Innym rozwiązaniem byłoby ustawienie include path w Twoim httpd.conf lub an .plik htaccess.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-09 01:01:54
Spójrz na http://au.php.net/reserved.variables
Myślę, że zmienna, której szukasz to: $_SERVER["DOCUMENT_ROOT"]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 23:50:49
Możesz zdefiniować stałą ze ścieżką do katalogu głównego twojego projektu, a następnie umieścić ją na początku ścieżki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-07 04:04:55
Innym sposobem radzenia sobie z tym, który eliminuje potrzebę dołączania, jest użycie funkcji autoload. Włączenie wszystkiego, czego potrzebuje twój skrypt "na wszelki wypadek" może utrudnić wydajność. Jeśli Twoje includes są definicjami klas lub interfejsów i chcesz je załadować tylko wtedy, gdy jest to potrzebne, możesz przeciążyć funkcję __autoload()
własnym kodem, aby znaleźć odpowiedni plik klasy i załadować go tylko wtedy, gdy jest wywołany. Oto przykład z podręcznika:
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
As long as you set Twoje zmienne include_path w związku z tym nigdy nie musisz dołączać pliku klasy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:28:50
Inną opcją, związaną z Kevinem, jest użycie __FILE__
, ale zamiast tego zastąp nazwę pliku php z jego wnętrza:
<?php
$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');
?>
Używam tego od jakiegoś czasu. Jedynym problemem jest to, że czasami nie masz $_SERVER['SCRIPT_NAME']
, ale czasami istnieje inna zmienna podobna.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-27 18:23:02
Uważam, że to działa bardzo dobrze!
function findRoot() {
return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}
Użycie:
<?php
function findRoot() {
return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}
include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');
include(findRoot() . 'includes/head.php');
for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
$posts[$i]->displayArticle();
}
include(findRoot() . 'includes/footer.php');
?>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-04 10:24:34
Myślę, że najlepszym sposobem jest umieszczenie twoich includes w PHP include path. Istnieją różne sposoby, aby to zrobić w zależności od konfiguracji.
Wtedy możesz po prostu odwołać się do
require_once 'inc1.php';
Z dowolnego pliku, niezależnie od tego, gdzie znajduje się w Twoich plikach includes lub w twoich dostępnych w sieci plikach, lub na dowolnym poziomie zagnieżdżonych podkatalogów.
Pozwala to na umieszczanie plików nagłówkowych poza głównym serwerem WWW, co jest najlepszą praktyką.
Np.
site directory
html (web root)
your web-accessible files
includes
your include files
Zobacz też out _ _ autoload dla leniwego ładowania plików klasy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-07 19:23:14
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
Używam tej linii kodu. Wraca do" góry " drzewa witryny, a następnie przechodzi do żądanego pliku.
Na przykład, załóżmy, że mam takie drzewo plików:
Domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php
Mogę włączyć funkcje.plik php z dowolnego miejsca, wystarczy skopiować wklejenie
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");
Jeśli potrzebujesz użyć tego kodu wiele razy, możesz utworzyć funkcję, która zwraca str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))
część. Następnie po prostu włóż tę funkcję do pierwszego dołączonego pliku. Mam " initialize.php " plik, który dołączam na samej górze każdej strony php i który zawiera tę funkcję. Następnym razem, gdy będę musiał załączyć pliki, w rzeczywistości po prostu używam funkcji (o nazwie path_back
):
require(path_back()."/_resources/another_php_file.php");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-13 14:37:07
Tak, oczywiście. Na przykład używamy pojedynczej warstwy podfolderów, ogólnie:@Flubba, czy to pozwala mi mieć foldery w moim katalogu include? płaskie katalogi dają mi koszmary. tak jak cały katalog obiektów powinien znajdować się w katalogu inc.
require_once('library/string.class.php')
Musisz uważać, aby zbytnio polegać na ścieżce include w witrynach o naprawdę dużym natężeniu ruchu, ponieważ php musi przeszukiwać bieżący katalog, a następnie wszystkie katalogi na ścieżce include, aby sprawdzić, czy Twój plik tam jest, a to może spowolnić działanie, jeśli jesteś nawalony.
Więc na przykład, jeśli robisz MVC, umieścisz ścieżkę do directoy aplikacji w ścieżce include, a następnie określ reference to things w formularzu
'model/user.class'
'controllers/front.php'
Albo cokolwiek.
Ale ogólnie rzecz biorąc, po prostu pozwala Ci pracować z naprawdę krótkimi ścieżkami w PHP, które będą działać z dowolnego miejsca i są o wiele łatwiejsze do odczytania niż cała ta ścieżka realpath dokument root malarkey.
Zaletą tych alternatyw opartych na skryptach, które inni zasugerowali, jest to, że działają wszędzie, nawet na współdzielonych polach; ustawienie ścieżki dołączania wymaga trochę więcej przemyśleń i wysiłku, ale jak wspomniałem, pozwala zacząć używać __autoload, który jest po prostu najfajniejszy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-08 23:17:12
Jeśli chcesz dołączyć określoną ścieżkę do większości plików w aplikacji, Utwórz zmienną globalną w folderze głównym.
define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));
Teraz ta globalna zmienna "APPLICATION_PATH " może być używana do dołączania wszystkich plików zamiast wywoływania realpath () za każdym razem, gdy dodajesz nowy plik.
EX:
include(APPLICATION_PATH ."/config/config.ini";
Mam nadzieję, że pomoże; -)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-09 10:10:21