За последние 24 часа нас посетили 18660 программистов и 1661 робот. Сейчас ищут 882 программиста ...

Возможно ли сделать пути относительно исполняемого файла?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Cloun, 30 июл 2009.

  1. Cloun

    Cloun Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    Возможно ли сделать пути относительно исполняемого файла, а не запрашиваемого?
    Например у меня есть дерево каталогов:
    Код (Text):
    1. www/
    2.   index.php
    3.   lib/
    4.     A.php
    5.   inc/
    6.     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
     
  2. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Найденное решение хорошее, чем оно Вам не по вкусу, да и за чем вообще Вам понадобилось менять путь относительно исполняемого файла?
     
  3. Cloun

    Cloun Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    Видимо это моя идеологическая ошибка, но хочется разрабатывать на PHP в стиле С++..
    Ну а решение просто выглядит не очень, и среда разработки такие include не видит.
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Вот пример, с опорой на С++

    PHP:
    1. <?php
    2.  
    3. // #ifndef CD
    4. // #define CD dirname(__FILE__)
    5. define('CD', dirname(__FILE__));
    6. // #endif
    7.  
    8. // Или следующим образом
    9. // Аналог С++ в этом случае будет директория с библиотеками (<>)
    10. set_include_path(dirname(__FILE__).DIRECTORY_SEPARATOR);
    11.  
    12. // Например
    13. //#include <abc.c>
    14. include "abc.php";
    15.  
    16. // #include "def.php"
    17. include CD."def.php";
    18.  
    19. ?>
     
  5. Cloun

    Cloun Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    Apple
    Честно говоря я не понял, как использовать ваш пример что бы он помог мне в моем случае... не могли бы пояснить?
     
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Или я не понял задачу, или вы не поняли решения.
    Предыдущие дериктории относительно можно указывать как двоеточие .. и точка соответственно.

    PHP:
    1. <?
    2.  
    3. include '../inc/abc.php';
    4.  
    5. ?>
     
  7. Cloun

    Cloun Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    Ясно. Вопрос не в том, как обратиться к предыдущей директории, а в том предыдущая чему она будет.
    В PHP директорией отсчета является директория в которой лежит стартовый файл. А я хотел бы что бы отсчитывалась от директории того файла, в котором я вызываю директиву (скорее функцию) include.
     
  8. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    и так каждый раз? когда php будет видеть include он должен изворачиваться и менять "директорию отсчета"?

    напишите свою функцию myinclude(string);
     
  9. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Может сделать так?
    Код (Text):
    1.  
    2. myApp/
    3.     inc/
    4.         B.php
    5.     lib/
    6.         A.php
    7.     www/
    8.         index.php
     
  10. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Допустим, у меня такая структура:
    Код (Text):
    1. myEngine/
    2.   Lib/
    3.     OOphp/
    4.       OOphp.php
    5.       Number.php
    6.       String.php
    7.       Map.php
    8.     *
    9.   Core/
    10.     index.php
    11.     init.php
    12.   Classes/
    13.     *
    В индексе у меня require_once 'init.php';
    В ините:
    Код (Text):
    1. define ('ENGINE_PATH', realpath(dirname(__FILE__) . "/../") . "/");
    2. require_once ENGINE_PATH . 'Lib/OOphp/OOphp.php';
    В OOphp.php:
    Код (Text):
    1. require_once 'Number.php';
    2. require_once 'String.php';
    3. require_once 'Map.php';
    Во-первых: не знаю почему, но у меня инклуд в каждом файле идет относительно ТЕКУЩЕГО файла.
    Во-вторых: почему бы не сделать константу ENGINE_PATH и красиво ее подключать?
     
  11. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Я думаю Вам нужна ф-ция chdir()
     
  12. Cloun

    Cloun Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    Можно и так это назвать. Но странно что в php working directory связана с директорией отсчета включений. Дело в том, что если я хочу написать полностью автономный модуль, достаточно крупный модуль, состоящий из нескольких файлов с исходными кодами, сгруппированными при помощи каталогов, и включать его в свои проекты, то расчет включений относительно working directory, т.е. каждого частного использования модуля, просто не позволяет мне сделать модуль автономным!
    а вот эта идея мне нравится.. только мне файл с этой функцией надо будет каждый раз включать.. либо воспользоваться autoload и превратить в класс...
    В любом случае, спасибо за идею.
     
  13. Cloun

    Cloun Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    На самом деле все просто и понятно. PHP - интерпретируемый язык, и этапа компиляции у него нет. Вся обработка исходного кода идет в момент исполнения, в том числе и включение файлов. Именно поэтому текущая директория связана с директорией отсчета включений файлов.
    Просто с моей идеологией надо переходить на другие языки. А пытаться сделать из php что-то похожее на C++ - глупо. У каждого языка есть свои назначения...
    Спасибо всем за ответы.
     
  14. Как всегда, самое правильное и очевидное решение не было озвучено.

    http://php.net/set_include_path
     
  15. Cloun

    Cloun Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    Не понимаю, какая польза мне от этой функции.
    Кстати, решение с своей функцией my_include - тоже не прокатывает, так как константа __FILE__ будет возвращать файл, в котором определена эта функция, либо мне ее надо будет определять в каждом файл, что, исключает все преимущества данного подхода.