Intereting Posts
Как получить json Respone из Guzzle, опубликовать защищенный google-лист Я получаю пустое письмо от php и js Проверка того, что клиент уже купил что-то в WooCommerce Переназначение массива освобождает память, используемую им? CakePHP Число разбиения на страницы не соответствует запросу? Опубликовать многомерный массив с использованием CURL и получить результат на сервере запуск load_class на mthaml Нужно регулярное выражение, чтобы добавить класс css в первый и последний элемент списка Использование Ajax для заполнения окна выбора Локальная страница не работает. Localhost перенаправляет вас слишком много раз. Laravel 5.3 XMLhttpRequest> PHP> XMLhttpRequest Настройка HTTPS для поддомена подстановочных знаков на локальном хосте стандартный метод получения уведомления из базы данных об изменении / вставке Такая же политика происхождения – JavaScript-вызов PHP Как изменить формат даты в зависимости от страны

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

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

В принципе, у меня есть три файла.

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

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

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

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

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

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

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

Любые идеи, что я делаю неправильно?

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

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

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

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

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

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

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

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

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

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

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

Я возьму математический подход. 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" и не нужно беспокоиться о путях и т. Д.

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

Изменить: oops, моя ошибка.

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

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