Абсолютный (или относительный?) Путь в PHP - PullRequest
2 голосов
/ 23 июня 2011

Извините за вопрос, так как на него можно было ответить много раз, но мой вопрос немного отличается

У меня есть дерево, как

/var/www/path/to/my/app/
   -- index.php
   -- b.php
   -- inc/
      -- include.php

(я обращаюсь к inc / include.php из index.php,

include "inc/include.php";

)

но в include.php мне нужно получить абсолютный путь к корню APPLICATION, а не DOCUMENT_ROOT поэтому в результате я должен иметь возможность использовать эту команду

//inc/include.php
include(APP_ROOT."/b.php");

повторяю, я НЕ ХОЧУ НАЗВАТЬ, КАК

include("../b.php");

есть ли нативная функция, если это возможно?

UPDATE:

Я хочу получить PATH через PHP, так как любой открытый источник должен иметь обнаружение этого пути Зачем? Если я захочу включить inc / include.php из ajax / 1 / somethiing.php, это удачно, но затем inc / include.php попытается включить ajax / b.php вместо b.php

Для Пекки:

У меня есть это дерево

-- index.php
-- b.php
-- inc/
    -- include.php
-- ajax/
    -- 1/
       -- ajax.php

Теперь посмотри. Из index.php вы будете звонить inc / include.php

include("inc/include.php"); //included file

теперь включен поиск файлов для

include("../b.php");

Это будет работать, но! Если бы я вызвал include из inc / include.php из ajax / 1 / ajax.php, как это

include("../../inc/include.php");

это будет работать, но включенный файл попытается включить

../b.php 

вместо ../../b.php как путь относительно файла, который ВКЛЮЧЕН, что inc / include.php Понял?

Ответы [ 6 ]

5 голосов
/ 23 июня 2011

есть ли нативная функция, если это возможно?

нет. Корень документа - это единственное, что вы можете получить из PHP. (Обратите внимание, что в вашем сценарии вы можете просто вызвать include("b.php");, потому что скрипт все еще находится в контексте index.php.)

Re ваше обновление:

Вы можете определить глобальный корень приложения в центральном файле конфигурации. Скажем, у вас есть config.php в корне приложения. Затем сделайте

define("APP_ROOT", dirname(__FILE__));

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

include ("../../../config.php");

но как только вы это сделаете, вы можете работать с корнем приложения внутри скрипта:

include (APP_ROOT."/b.php");  <--  Will always return the correct path
2 голосов
/ 23 июня 2011

Вы можете разрешить путь с текущим файлом в качестве базы

include dirname(__FILE__) . DIRECTORY_SEPARATOR . '/../b.php';

или начиная с PHP5.3

include __DIR__ . \DIRECTORY_SEPERATOR . '/../b.php';
1 голос
/ 23 июня 2011

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

В вашем index.php или файле конфигурации:

define(
    'INC',
    realpath(dirname(__FILE__)) .
    DIRECTORY_SEPARATOR .
    'inc' .
    DIRECTORY_SEPARATOR
);

В другом месте:

include(INC . 'include.php');

В качестве альтернативы, определите несколько констант для различных местоположений:

define('DOCUMENT_ROOT', realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR);
define('INC', DOCUMENT_ROOT . 'inc' . DIRECTORY_SEPARATOR);
define('AJAX', DOCUMENT_ROOT . 'ajax' . DIRECTORY_SEPARATOR);

В другом месте:

include(DOCUMENT_ROOT . 'b.php');
include(INC . 'include.php');
include(AJAX . 'ajax.php');
1 голос
/ 23 июня 2011

Хотя он не определяет корневой путь вашего приложения для вас, может быть интересно проверить set_include_path()

1 голос
/ 23 июня 2011

Просто используйте

define('APP_ROOT', 'your app root');

в index.php, например.Или в конфигурационном файле.

1 голос
/ 23 июня 2011

Добавьте в свой index.php:

$GLOBALS['YOUR_CODE_ROOT'] = dirname(__FILE__);

Добавьте в свой inc/include.php:

require_once $GLOBALS['YOUR_CODE_ROOT'].'/b.php';
...