Почему я должен использовать 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(), наконец, проверит в вызывающем script собственный каталог и текущий рабочий каталог перед сбоем. Конструкция include() выдаст предупреждение, если он не сможет найти файл; это другое поведение от require(), которое будет генерировать фатальную ошибку.
Ответы
Ответ 1
Скажем, у меня есть (поддельная) структура каталогов, например:
.../root/
/app
bootstrap.php
/scripts
something/
somescript.php
/public
index.php
Теперь предположим, что bootstrap.php
содержит некоторый код для настройки соединений с базой данных или какого-либо другого типа файлов с расширением.
Предположим, вы хотите включить файл в папку boostrap.php
с именем init.php
. Теперь, чтобы избежать сканирования всего пути include с помощью include 'init.php'
, вы можете использовать include './init.php'
.
Есть проблема, хотя. Этот ./
будет относиться к script, который включал 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')?
Ответ 2
Если вы хотите, чтобы код работал на нескольких серверах с разными средами, тогда нам нужно
использовать dirname (FILE) в операторе include или include_once.
причина следующая.
1. Не предоставляйте абсолютный путь для включения файлов на ваш сервер.
2. Динамически вычислить полный путь, как абсолютный путь.
Используйте комбинацию имени dirname (FILE) и последующих вызовов к себе, пока не дойдете до дома вашего '/myfile.php'.
Затем присоедините эту переменную, которая содержит путь к вашим включенным файлам.
Ответ 3
Я использовал это ниже, если это то, о чем вы думаете. Это сработало для меня.
<?php
include $_SERVER['DOCUMENT_ROOT']."/head_lib.php";
?>
То, что я пытался сделать, это файл pulla, названный /head _lib.php из корневой папки. Это не потянет ничего, чтобы создать веб-страницу. Заголовок, нижний колонтитул и другие ключевые функции в подкаталогах никогда не появятся. Пока я не сделал это, он работал как чемпион.