Что лучше требовать (dirname (__ FILE __). '/'. 'MyParent.php'), чем просто требуется ('myParent.php')?
Множество известных скриптов PHP, включая WordPress, используют dirname(__FILE__).'/myParent.php'
вместо 'myParent.php'
при включении файлов в тот же каталог текущего script.
Разве они не то же самое? Почему вы предпочитаете печатать больше?
Спасибо.
Ответы
Ответ 1
PHP должен знать абсолютный путь к файлу. dirname(__FILE__).'/myParent.php'
уже является абсолютным путем, но 'myParent.php'
требует поиска с использованием заданных путей в include_path, чтобы получить абсолютный путь и найти файл. Лучшим выбором будет './myParent.php'
:
Однако более эффективно явно использовать include './file'
, чем PHP всегда проверяет текущий каталог для каждого include.
Ответ 2
Помимо увеличения производительности (что, вероятно, является предварительной оптимизацией в большинстве случаев *), оно также защищает от (очень странного) сценария, в котором у конфигурации 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();
Тест проводился на Macbook 10.5.8 с частотой 2.16 ГГц с PHP версии 5.2.9 (www.entropy.ch Release 7)
Ответ 3
Использование dirname + имя файла немного быстрее, потому что PHP не будет перебирать через include_path поиск файла. Если скорость имеет значение, вы, скорее всего, напечатаете больше.
Ответ 4
Добавлена заметка о include ('./file.php').
Если имеет значение только скорость, тогда да, вы можете использовать include ('./file.php'), но если вы хотите разрешать проблемы с зависимостями и относительными путями, вам лучше использовать dirname (__ FILE __), потому что
include('./file.php')
будет по-прежнему строить пути относительно исполняемого script ( включая script), а
include(dirname(__FILE__).'/file.php');
будет разрешать пути относительно текущего script, где находится эта строка ( включен script).
Как правило, вам лучше использовать dirname (__ FILE __), так как "./" дает незначительное увеличение производительности, тогда как dirname (__ FILE __) дает вам гораздо более надежную версию.
/EDIT: Также обратите внимание, что приведенный выше тест относится только к include('./something.php')
, который действительно быстрее, чем include('something.php')
, потому что у вас нет хоста include_path, но когда вы используете dirname(__FILE__)
, вы получаете dirname()
функция, которая делает ее медленнее, чем хождение по пути include_path (если у вас нет много путей в include_path).