Возможно ли сделать пути относительно исполняемого файла, а не запрашиваемого? Например у меня есть дерево каталогов: Код (Text): www/ index.php lib/ A.php inc/ B.php В случае, если запрашиваемый файл index.php, то включение A.php из index.php выглядит так include('lib/A.php'); А вот включение B.php из A.php выглядит include('inc/B.php');, т.е. пути рассматриваются относительно файла index.php, а хотелось бы относительно исполняемого файла A.php, т.е. include('../inc/B.php'); Я нашел такое решение include(dirname(__FILE__) . '/../inc/B.php'); Но мне не нравится как это все выглядит. Подскажите, можно ли это сделать, например при помощи настройки php? Или как-нибудь более прозрачно? система: win/unix Apache 2.2 + PHP 5.2
Найденное решение хорошее, чем оно Вам не по вкусу, да и за чем вообще Вам понадобилось менять путь относительно исполняемого файла?
Видимо это моя идеологическая ошибка, но хочется разрабатывать на PHP в стиле С++.. Ну а решение просто выглядит не очень, и среда разработки такие include не видит.
Вот пример, с опорой на С++ PHP: <?php // #ifndef CD // #define CD dirname(__FILE__) define('CD', dirname(__FILE__)); // #endif // Или следующим образом // Аналог С++ в этом случае будет директория с библиотеками (<>) set_include_path(dirname(__FILE__).DIRECTORY_SEPARATOR); // Например //#include <abc.c> include "abc.php"; // #include "def.php" include CD."def.php"; ?>
Apple Честно говоря я не понял, как использовать ваш пример что бы он помог мне в моем случае... не могли бы пояснить?
Или я не понял задачу, или вы не поняли решения. Предыдущие дериктории относительно можно указывать как двоеточие .. и точка соответственно. PHP: <? include '../inc/abc.php'; ?>
Ясно. Вопрос не в том, как обратиться к предыдущей директории, а в том предыдущая чему она будет. В PHP директорией отсчета является директория в которой лежит стартовый файл. А я хотел бы что бы отсчитывалась от директории того файла, в котором я вызываю директиву (скорее функцию) include.
и так каждый раз? когда php будет видеть include он должен изворачиваться и менять "директорию отсчета"? напишите свою функцию myinclude(string);
Допустим, у меня такая структура: Код (Text): myEngine/ Lib/ OOphp/ OOphp.php Number.php String.php Map.php * Core/ index.php init.php Classes/ * В индексе у меня require_once 'init.php'; В ините: Код (Text): define ('ENGINE_PATH', realpath(dirname(__FILE__) . "/../") . "/"); require_once ENGINE_PATH . 'Lib/OOphp/OOphp.php'; В OOphp.php: Код (Text): require_once 'Number.php'; require_once 'String.php'; require_once 'Map.php'; Во-первых: не знаю почему, но у меня инклуд в каждом файле идет относительно ТЕКУЩЕГО файла. Во-вторых: почему бы не сделать константу ENGINE_PATH и красиво ее подключать?
Можно и так это назвать. Но странно что в php working directory связана с директорией отсчета включений. Дело в том, что если я хочу написать полностью автономный модуль, достаточно крупный модуль, состоящий из нескольких файлов с исходными кодами, сгруппированными при помощи каталогов, и включать его в свои проекты, то расчет включений относительно working directory, т.е. каждого частного использования модуля, просто не позволяет мне сделать модуль автономным! а вот эта идея мне нравится.. только мне файл с этой функцией надо будет каждый раз включать.. либо воспользоваться autoload и превратить в класс... В любом случае, спасибо за идею.
На самом деле все просто и понятно. PHP - интерпретируемый язык, и этапа компиляции у него нет. Вся обработка исходного кода идет в момент исполнения, в том числе и включение файлов. Именно поэтому текущая директория связана с директорией отсчета включений файлов. Просто с моей идеологией надо переходить на другие языки. А пытаться сделать из php что-то похожее на C++ - глупо. У каждого языка есть свои назначения... Спасибо всем за ответы.
Не понимаю, какая польза мне от этой функции. Кстати, решение с своей функцией my_include - тоже не прокатывает, так как константа __FILE__ будет возвращать файл, в котором определена эта функция, либо мне ее надо будет определять в каждом файл, что, исключает все преимущества данного подхода.