Как включить PHP файлов, которые требуют абсолютного пути?

голоса
83

У меня есть структура каталогов, как следующие;

script.php

вкл / include1.php
вкл / include2.php

Объекты / object1.php
объекты / object2.php

мыло / soap.php

Теперь я использую эти объекты как script.phpи /soap/soap.phpя мог переместить их, но я хочу структуру каталогов , как , что для конкретной причины. При выполнении script.phpвключаемого пути inc/include.phpи при выполнении /soap/soap.phpего ../inc, абсолютные пути работать, /mnt/webdev/[project name]/inc/include1.php...но это уродливое решение , если я когда - нибудь хочу , чтобы переместить каталог в другое место.

Так есть ли способ использовать относительные пути, или способ programically генерировать /mnt/webdev/[project name]/?

Задан 07/08/2008 в 04:46
источник пользователем
На других языках...                            


11 ответов

голоса
6

Вы можете определить константу с путем к корневой директории вашего проекта, а затем положить, что в начале пути.

Ответил 07/08/2008 в 05:04
источник пользователем

голоса
139

Это должно работать

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

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

Edit: добавлена imporvement по aussieviking

Ответил 07/08/2008 в 05:20
источник пользователем

голоса
7

посмотреть на http://au.php.net/reserved.variables

Я думаю, что переменное вы ищете: $_SERVER["DOCUMENT_ROOT"]

Ответил 07/08/2008 в 05:25
источник пользователем

голоса
41

Вы можете использовать относительные пути. Попробуйте __FILE__. Это PHP константа , которая всегда возвращает путь / имя файла сценария он находится в Так, в. soap.php, Можно сделать следующее :

include dirname(__FILE__).'/../inc/include.php';

Полный путь и имя файла. При использовании внутри включаемого, имя включаемого файла возвращается. Начиная с PHP 4.0.2, __FILE__всегда содержит абсолютный путь с симлинками решенных , тогда как в более ранних версиях она содержала относительный путь при некоторых обстоятельствах. (источник)

Другим решением было бы установить включить путь в ваш httpd.conf или .htaccess файл.

Ответил 07/08/2008 в 06:05
источник пользователем

голоса
1

Я думаю, что лучший способ это поставить ваш включает в вашем PHP включают путь. Существуют различные способы, чтобы сделать это в зависимости от ваших настроек.

Тогда вы можете просто обратиться к

require_once 'inc1.php';

внутри любого файла независимо от того, где он находится, включает ли в вашем или в вашем веб-доступных файлов, или любого уровня вложенности подкаталогов.

Это позволяет иметь включаемых файлов вне корня веб-сервера, который является лучшей практики.

например

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

Кроме того, проверьте __autoload для отложенной загрузки файлов класса

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

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

Ответил 07/08/2008 в 20:20
источник пользователем

голоса
0

@Flubba, что это позволяет мне иметь папки внутри моего включают каталог? квартира включает в себя каталоги дают мне кошмары. как объекты, весь каталог должен находиться в каталоге ИНК.

Ах, да, абсолютно. Так, например, мы используем один слой вложенных папок, в целом:

require_once('library/string.class.php')

Вы должны быть осторожны с опираясь на включаемого путь слишком много в очень высоких местах движения, потому что PHP должен охотиться через текущий каталог, а затем все каталоги на включаемого пути для того, чтобы увидеть, если ваш файл существует, и это может замедлить вещи, если вы попали в тиски.

Так, например, если вы делаете MVC, вы бы поставить путь к заявке directoy в заголовочном пути, а затем указать относиться к вещам в форме

'model/user.class'
'controllers/front.php'

или любой другой.

Но, вообще говоря, он просто позволяет работать с очень короткими ходами в вашем PHP, которые будут работать в любом месте, и это намного проще, чем читать все это Realpath документ корня катит.

Преимущество этих альтернатив на основе сценариев другие предположили, они работают в любом месте, даже на общих коробках; установка включаемого пути требует немного больше мысли и усилий, но, как я уже позволяет начать использовать __autoload, которые просто крутой.

Ответил 09/08/2008 в 00:17
источник пользователем

голоса
2

Другой вариант, связанный с Кевином, является использование __FILE__, но вместо того, чтобы заменить имя файла PHP внутри него:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

Я использую это на некоторое время. Единственная проблема в том , иногда нет $_SERVER['SCRIPT_NAME'], но иногда есть еще одна переменная похожа.

Ответил 09/09/2008 в 23:49
источник пользователем

голоса
4

Другой способ справиться с этим , что устраняет любую потребность включает в себя вовсе использовать автозагрузку функцию. В том числе все ваш скрипт нужно « на всякий случай» может снизить производительность. Если ваши включает все определения класса или интерфейса, и вы хотите , чтобы загрузить их только в случае необходимости, вы можете перегрузить __autoload()функцию с вашим собственным кодом , чтобы найти подходящий файл класса и загрузить его только тогда , когда это называется. Вот пример из руководства:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

До тех пор, как вы установите ваши переменные INCLUDE_PATH соответственно, вам не нужно включать класс файл снова.

Ответил 18/09/2008 в 15:28
источник пользователем

голоса
2

Я нашел, что это работает очень хорошо!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

Использование:

<?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');

?>
Ответил 10/02/2012 в 20:00
источник пользователем

голоса
1
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

Я использую эту строку кода. Она восходит к «вершине» дерева сайта, а затем переходит к нужному файлу.

Например, предположим, что у меня есть этот файл дерева:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

Я могу включить файл functions.php, где бы я, просто копия оклейки

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

Если вам нужно использовать этот код много раз, вы можете создать функцию , которая возвращает str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))часть. Тогда просто вставить эту функцию в первом файле вы включаете. У меня есть файл «initialize.php» , что я включать в самой верхней части каждой страницы PHP и которая содержит эту функцию. В следующий раз я должен включать в себя файлы, я на самом деле просто использовать эту функцию ( по имени path_back):

require(path_back()."/_resources/another_php_file.php");
Ответил 13/04/2015 в 14:33
источник пользователем

голоса
0

Если вы собираетесь включить конкретный путь в большинстве файлов в вашем приложении, создать глобальную переменную в корневой папке.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Теперь этот Глобальный переменный « APPLICATION_PATH » может использоваться , чтобы включить все файлы вместо вызова Realpath () каждый раз включить новый файл.

EX:

include(APPLICATION_PATH ."/config/config.ini";

Надеюсь, поможет ;-)

Ответил 09/05/2018 в 10:10
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more