Почему я должен использовать dirname (__ FILE__) в инструкции include или include_once?

Я видел это:

<?php include( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my_file.php'); ?> 

Зачем мне это нужно? Зачем мне решать проблему с именем dirname, а затем конкатенировать это с помощью разделителя каталогов и нового имени файла?

Является ли приведенный выше код не эквивалентным этому:

 <?php include( 'my_file.php' ); ?> 

??

В PHP-документе говорится:

Файлы включаются в зависимости от заданного пути к файлу или, если ни один не указан, указан путь include_path. Если файл не найден в include_path, include () будет, наконец, проверять собственный каталог вызывающего сценария и текущий рабочий каталог перед сбоем. Конструкция include () выдаст предупреждение, если он не сможет найти файл; это другое поведение от require (), которое будет генерировать фатальную ошибку.

Допустим, у меня есть (поддельная) структура каталогов, например:

 .../root/ /app bootstrap.php /scripts something/ somescript.php /public index.php 

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

Предположим, вы хотите включить файл в папку init.php называемую init.php . Теперь, чтобы избежать сканирования всего пути include с include 'init.php' , вы можете использовать include './init.php' .

Однако есть проблема. Это ./ будет относиться к скрипту, который включал bootstrap.php , а не bootstrap.php . (С технической точки зрения, это будет относиться к рабочему каталогу.)

dirname(__FILE__) позволяет вам получить абсолютный путь (и, следовательно, избежать поиска путей включения), не полагаясь на рабочий каталог, являющийся каталогом, в котором находится bootstrap.php .

(Примечание: начиная с PHP 5.3 вы можете использовать __DIR__ вместо dirname(__FILE__) .)

Теперь, почему бы просто не использовать include 'init.php'; ?

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

Примечание. Около половины этого ответа является адресом в довольно старом сообщении: что лучше требовать (dirname (__ FILE __). '/'. 'MyParent.php'), чем просто требовать ('myParent.php')?

Если вы хотите, чтобы код работал на нескольких серверах с разными средами, тогда нам нужно использовать dirname ( FILE ) в операторе include или include_once. причина следующая. 1. Не предоставляйте абсолютный путь для включения файлов на ваш сервер. 2. Динамически вычислять полный путь, как абсолютный путь.

Используйте комбинацию dirname ( FILE ) и последующих вызовов к себе, пока не дойдете до дома вашего /myfile.php. Затем присоедините эту переменную, которая содержит путь к вашим включенным файлам.

Я использовал это ниже, если это то, о чем вы думаете. Это сработало для меня.

 <?php include $_SERVER['DOCUMENT_ROOT']."/head_lib.php"; ?> 

То, что я пытался сделать, это файл pulla, названный /head_lib.php из корневой папки. Это не потянет ничего, чтобы создать веб-страницу. Заголовок, нижний колонтитул и другие ключевые функции в подкаталогах никогда не появятся. Пока я не сделал это, он работал как чемпион.