Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Относительный путь и текущая папка


Автор: Vitalik 1.8.2007, 18:44
Здравствуйте!..

Возникла такая проблема..

Есть проект, находящийся в папке /htdocs/project/
Стартовый файл: /htdocs/project/index.php
Внутри файла index.php инклудится файл /htdocs/project/sub1/sub2/somefile.inc
Код
Файл index.php:
  ...
  include('sub1/sub2/somefile.inc')
  ...

Внутри файла sub1/sub2/somefile.inc необходимо инклудить файл, находящийся в родительской папке, то есть к примеру файл sub1/need_to_incude.inc
Раньше я делал так:
Код
Файл sub1/sub2/somefile.inc:
  ...
  include('../need_to_incude.inc');
  ...
И все работало прекрасно. Но теперь почему-то PHP ищет файл need_to_incude.inc в родительской папке не по отношению к файлу somefile.inc, а по отношению к файлу index.php. Таким образом оно хочет инклудить файл /htdocs/need_to_incude.inc, а не /htdocs/project/sub1/need_to_incude.inc :(

Уже есть очень много файлов в папке sub1, и много папок вида sub2 с многими файлами внутри, которые инклудят эти первые файлы из папки sub1. Поэтому менять везде короткий относительный путь на полный абсолютный совсем не хочется.. Еще этого не хочется делать потому как при составлении этих файлов хочется чтобы они выглядели компактнее, тогда с ними удобнее работать..

Автор: mishaSL 1.8.2007, 19:48
Vitalik, посмотри что указано в директиве include_path
Код

print get_include_path();


Для справки:
Код

include_path string

    Специфицирует список директорий, где функции require(), include() и fopen_with_path() ищут файлы. Формат напоминает системную переменную окружения PATH: список директорий, разделённых двоеточием в UNIX или точкой запятой - в Windows.
    Пример UNIX include_path

    include_path=.:/home/httpd/php-lib

    Пример Windows include_path

    include_path=".;c:\www\phplib"

    Значение по умолчанию:  . (только текущая директория). 



Цитата(Vitalik @  1.8.2007,  18:44 Найти цитируемый пост)
Еще этого не хочется делать потому как при составлении этих файлов хочется чтобы они выглядели компактнее, тогда с ними удобнее работать.. 

ИМХО, гораздо удобнее работать с абсолютными путями. Объявляешь в конфигурационном файле путь до проекта, а дальше при инклюде только дописываешь эту переменную.

Автор: Всемогущий 1.8.2007, 19:55
Мне кажется можно использовать такой метод:

после каждого инклуда автоматически  добавлять абсолютный адресс в include_path 

Автор: mishaSL 1.8.2007, 20:05
Какой-то странный метод. Может я не понял, можно пример?

Автор: Всемогущий 2.8.2007, 04:32
заменяем include на myinclude

Код

function myinclude($path){

         $temp=explode (PATH_SEPARATOR,get_include_path () );

         $temp[]=dirname(realpath (__FILE__));

         $otvet=implode (PATH_SEPARATOR, $temp) ;

         set_include_path ( $otvet ) ;

         return   include($path) ;



}

Автор: Fally 2.8.2007, 11:05
Vitalik, Попробуй вот так:
Код

include('./sub1/sub2/somefile.inc')

Автор: Vitalik 3.8.2007, 12:52
Большое спасибо всем ответившим  smile 

Простого решения этой проблемы, наверное, действительно нет..
Вполне возможно, что в PHP5 просто текущей директорией считается та, в которой находится самый первый "вызывающий" php-скрипт. А PHP4 по видимому текущей директорией была та, в которой находится текущий выполняемый php-скрипт (который мог быть инклуден в другой, в "вызывающий")..

Хотелось бы увидеть такое решение проблемы, чтобы не надо было перелопачивать все файлы.. Думал, что можно, просто поменяв какую-нить директиву, сказать об этом 5-му PHP.

Но раз это не представляется возможным, то есть в любом случае нужно будет проводить реорганизацию кода, то я решил сделать все несколько по-другому. Наверное, так даже будет удобнее. Все файлики need_to_include.inc будут собраны в одном большом, при чем они будут в виде функций. А в файлах вида somefile.inc нужно будет делать не инклуды, а вызовы этих функций. (естественно названия файлов я здесь привел вымышленные)
Таким образом, эта проблема в данном случае отпадает, так и не найдя своего решения..

Еще раз спасибо за попытки помочь!  smile 

Автор: Mal Hack 3.8.2007, 12:57
Есть более простой путь и более правильный.
Во всех include'ах, fopen'ах, пишем полный путь /home/www/..../file.php.
Дабы  избавиться от лишних правок, корень выносится в константу, которая в include конкатенируется с именем и путем файла от корня, т.е. в данном случае include(DIR."/sub2/include.php");

Автор: Vitalik 3.8.2007, 16:26
В принципе ведь, если написать
Код
include("sub2/include.php")
, то эффект будет тем же.. Путь ведь относительный.. Но тогда мне хотелось, чтобы он был еще относительней, и не привязывался даже к этому "корню".. Да и чтобы короче все выглядело и проще.. А то переименуешь вдруг папочку sub2 или еще какую, так сразу нужно будет во всех внутренних файлах инклуды менять..

Кстати, вопрос может быть немножко не в тему, но все же..
Файлы, которые инклудятся принято делать с расширением inc или не стоит так делать и лучше, чтобы у всех было php?..

Автор: Mal Hack 3.8.2007, 16:38
Файлы с полным путем инклудяться быстрее, плюс это избавит от многих непонятных ошибок...

Лучше - php.

Автор: sTa1kEr 3.8.2007, 19:16
Vitalik, если хотите использовать относительные пути, то лучше всего подойдет такая конструкция
Код

include(dirname(__FILE__)."/include.php");

Т.е. для инклюда путь будет абсолютным, а для вас относительным.

Цитата(Vitalik @  3.8.2007,  16:26 Найти цитируемый пост)
Файлы, которые инклудятся принято делать с расширением inc или не стоит так делать и лучше, чтобы у всех было php?

Не советую использовать расширение inc. Т.к. по умолчанию такой файл будет интерпретироваться апачем как текстовый, что может привести к проблеме в безопасности. В крайнем случае лучше использовать inc.php. 

Автор: Vitalik 3.8.2007, 19:40
Цитата(Mal Hack @  3.8.2007,  15:38 Найти цитируемый пост)
Лучше - php.

Можно дурацкий вопрос?.. Чем лучше расширение php?..
Просто я вот как-то раньше думал, что логичнее выглядит, если php - это файлы, которые могут быть запущены отдельно, а inc - это файлы, которые имеют смысл только если их инклудить..
Но вот недавно услышал такую вещь, что лучше использовать всегда php из-за того, что при загрузке из браузера php-код никогда виден не будет, а inc'овские файлы могут загрузиться как текстовые показав клиенту весь свой исходный код..
Есть ли еще какие-то причины не использовать расширение inc?.. user posted image

Добавлено через 3 минуты и 33 секунды
sTa1kEr, пасибки smile
Пока я набивал сообщение (пару раз приходилось отходить надолго) вы уже написали похожий ответ (про inc-файлы), спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)