Что лучше требовать (dirname (__ FILE __). '/'. 'MyParent.php'), чем просто требовать ('myParent.php')?

Множество известных PHP-скриптов, включая WordPress, используют dirname(__FILE__).'/myParent.php' вместо 'myParent.php' при включении файлов в тот же каталог текущего скрипта.

Разве они не то же самое? Почему вы предпочитаете печатать больше?

Благодарю.

PHP должен знать абсолютный путь к файлу. dirname(__FILE__).'/myParent.php' уже является абсолютным путем, но 'myParent.php' требует поиска с использованием заданных путей в include_path для получения абсолютного пути и поиска файла. Лучшим выбором будет './myParent.php' :

Тем не менее, более эффективно явно использовать include './file' чем PHP, всегда проверяющий текущий каталог для каждого include.

Помимо увеличения производительности (что, вероятно, является предварительным оптимизацией в большинстве случаев *), оно также защищает от (очень странного) сценария, когда в конфигурации PHP среды нет текущего каталога ( . ) Как часть пути включения.

* Контрольный показатель include использование пути, который требует include_path поиска по сравнению с относительным путем, который этого не делает. Протестировано более 100000 итераций каждый

Результаты

 include("include.php"): 8.3664200305939s include("./include.php"): 8.3511519432068s (8.3664200305939 - 8.3511519432068) / 100000 = 0.000000152680874s 

Если вы не включаете сотни или тысячи файлов, то 0,0000001s в лучшем случае незначительно.

Тестовый код

 define("MAX", 100000); ob_start(); $i = MAX; $_t = microtime(true); do { include("include.php"); } while ( --$i ); $_t = microtime(true) - $_t; ob_end_clean(); echo "include(\"include.php\"): {$_t}s\n"; ob_start(); $i = MAX; $_t = microtime(true); do { include("./include.php"); } while ( --$i ); $_t = microtime(true) - $_t; ob_end_clean(); в define("MAX", 100000); ob_start(); $i = MAX; $_t = microtime(true); do { include("include.php"); } while ( --$i ); $_t = microtime(true) - $_t; ob_end_clean(); echo "include(\"include.php\"): {$_t}s\n"; ob_start(); $i = MAX; $_t = microtime(true); do { include("./include.php"); } while ( --$i ); $_t = microtime(true) - $_t; ob_end_clean(); в define("MAX", 100000); ob_start(); $i = MAX; $_t = microtime(true); do { include("include.php"); } while ( --$i ); $_t = microtime(true) - $_t; ob_end_clean(); echo "include(\"include.php\"): {$_t}s\n"; ob_start(); $i = MAX; $_t = microtime(true); do { include("./include.php"); } while ( --$i ); $_t = microtime(true) - $_t; ob_end_clean(); 

Тест проводился на Macbook 10.5.8 с частотой 2.16 ГГц с PHP версии 5.2.9 (www.entropy.ch Release 7)

Использование dirname + имя файла немного быстрее, потому что PHP не будет проходить через include_path для поиска файла. Если скорость имеет значение, вы, скорее всего, напечатаете больше.

Добавлено примечание о include ('./ file.php').

Если нужна только скорость, тогда да, вы можете использовать include ('./ file.php'), но если вы хотите разрешать проблемы с зависимостями и относительными путями, вам лучше использовать dirname (__ FILE __), потому что

 include('./file.php') 

будет по-прежнему строить пути относительно исполняемого скрипта ( включая скрипт), в то время как

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

будет разрешать пути относительно текущего скрипта, где находится эта строка ( включенный скрипт).

Как правило, вам лучше использовать dirname (__ FILE __), так как «./» дает лишь незначительное увеличение производительности, тогда как dirname (__ FILE __) дает вам гораздо более надежное включение.

/ EDIT: Также обратите внимание, что в тесте, который делается выше, есть только include('./something.php') , который действительно быстрее, чем include('something.php') потому что у вас нет хоста include_path, но когда вы используете dirname(__FILE__) вы получаете служебные данные функции функции dirname() , что делает ее медленнее, чем хождение по пути include_path (если у вас нет много путей в include_path).