Включение файлов по относительному пути - PullRequest
2 голосов
/ 16 октября 2011

Должно быть что-то, чего я не понимаю в связи с файлами - но вот моя проблема.

По сути, у меня есть три файла.

  1. generalfunctions.php
  2. wordcount.php
  3. index.php

Все три файла находятся в разных каталогах.

B полагается на A следующим образом: ../../../phpfunctions/generalfucntions.php
И когда я бегу B, все хорошо.

Но C полагается на B следующим образом: ../wordcount.php

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

Фактическая ошибка:

Нет такого файла или каталога в /.../public_html/plaoul/text/statistics/wordcount.php в строке 11

Есть идеи, что я делаю не так?

Спасибо за вашу помощь.

Ответы [ 4 ]

4 голосов
/ 16 октября 2011

Когда вы используете include для включения файла и используете относительный путь в качестве параметра, он будет относительно текущего рабочего пути .

Каков текущий путь?Обычно это путь к первому PHP-скрипту.Сценарий, где началось все выполнение.Вы можете получить текущий рабочий каталог с помощью функции getcwd.Например: <?php echo getcwd(); ?> покажет вам текущий рабочий путь.Вы можете изменить текущий рабочий путь, используя функцию chdir.Например: <?php chdir( '/home/myself' ); ?> - с помощью этой команды вы только что изменили текущий рабочий путь!

Так что не всегда хорошо использовать относительные пути в , включая ,потому что текущий путь МОЖЕТ измениться.

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

Итак ... попробуйте следующее:

InB вы должны включить A следующим образом:

include( dirname( __FILE__ ) . '/../../../phpfunctions/generalfunctions.php' );

В C вы должны включить B следующим образом:

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

Короче: используя dirname( __FILE__ ), вы можете включить файл, используя путьотносительно файла, в котором находится команда «include».В противном случае путь будет относительно текущего рабочего пути.

1 голос
/ 16 октября 2011

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

Таким образом, если мы находимся в файле C (index.php), мы находимся на уровне 4. Файл C включает файл B, который находится в родительском каталоге (в соответствии с ../), который будет на уровне 3.

Теперь файл B включен внутри файл C (с дополнительным акцентом внутри). Мы все еще работаем с уровня 4, а не с уровня 3. Поэтому, когда вы пытаетесь включить файл A, мы технически включаем файл A в файл C, а не в файл B, поэтому путь идет только вверх по 3 каталогам вместо 4 каталоги, через которые он должен пройти.

Таким образом, когда мы выполняем файл B, который находится на уровне 3, включаемый файл A поднимется на три уровня до уровня 0, который является подходящим местом для поиска файла.

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

То, как я это делаю, - это установка корневой переменной, доступной во всех моих сценариях, для использования для определения абсолютных путей. Я поместил его в свой файл index.php, поскольку это единственный файл, который когда-либо запускался.

$ani->i->root = dirname(str_replace("\\", "/",  __FILE__));
// Where my $ani variable is accessible everywhere.

Таким образом, когда мне нужно включить / потребовать файлы, я могу просто сделать что-то вроде include "{$ani->i->root}/modules/somemodule.php" и не беспокоиться о путях и т. Д.

0 голосов
/ 16 октября 2011

Что происходит с include () в php, так это то, что функция заменяется в файле включенным файлом. Вы говорите с помощью ../wordcount.php, что файл находится в родительском каталоге текущего рабочего каталога. Если вы получите правильный путь для файла B, php заменит функцию в файле b содержимым файла a, а затем заменит функцию включения в файле C на файл A (после включения).

Редактировать: упс, моя ошибка.

0 голосов
/ 16 октября 2011

Попробуйте использовать абсолютное значение вместо

include("/public_html/phpfunctions/generalfunctions.php");
...