Jak dołączyć pliki PHP, które wymagają ścieżki bezwzględnej?

Mam strukturę katalogów jak poniżej;

Skrypt.php

Include1.php
include2.php

Obiekty / object1.php
obiekty / object2.php

Mydł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]/"?

 85
php
Author: Jasper, 2008-08-07

11 answers

To powinno zadziałać

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

Edit: dodany przez aussieviking

 140
Author: Peter Coulton,
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.

 42
Author: Kevin,
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"]

 7
Author: Christian Hagelid,
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.

 6
Author: Ryan Fox,
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.

 4
Author: Sam McAfee,
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.
 2
Author: Darryl Hein,
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');

?>
 2
Author: Thane Gill,
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

Http://www.google.com/search?q=setting+php + include + path

Http://www.google.com/search?q=__autoload

 1
Author: Polsonby,
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");
 1
Author: Machavity,
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

@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.

Tak, oczywiście. Na przykład używamy pojedynczej warstwy podfolderów, ogólnie:
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.

 0
Author: Polsonby,
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; -)

 0
Author: yuvraj,
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