относительный путь — почему многие разработчики PHP используют & quot; __DIR__. »../OtherFolder’&quot ;?

Часто я вижу этот тип кода __DIR__.'/../Resources/config', Но почему смысл, я ошибаюсь, что это то же самое, что печатать ../Resources/config' ?

4

Решение

Нет, это не всегда одно и то же. __DIR__ это каталог файл, не текущий рабочий каталог. Этот код по сути является динамически генерируемым абсолютный дорожка.

Запишите это в ~/foo/script.php:

<?php
// Ta, Sven
//  https://php.net/manual/en/function.realpath.php#84012
function get_absolute_path($path) {
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
$absolutes = array();
foreach ($parts as $part) {
if ('.' == $part) continue;
if ('..' == $part) {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
return '/' . implode(DIRECTORY_SEPARATOR, $absolutes);
}

$p = __DIR__ . '/../bar';
echo $p . "\n" . get_absolute_path($p) . "\n";
?>

Сейчас:

$ cd ~/foo
$ php script.php
/home/me/foo/../bar
/home/me/bar

$ cd ~/
$ php foo/script.php
/home/me/foo/../bar
/home/me/bar

Но если мы избавимся от __DIR__:

$ cd ~/foo
$ php script.php
../bar
/home/me/bar

$ cd ~/
$ php foo/script.php
../bar
/home/bar

Смотри … этот последний путь неверен.

Если бы мы использовали эти пути где-нибудь, они бы сломались без __DIR__,

Всякий раз, когда вы пишете скрипт, вы должны убедиться, что его можно безопасно выполнять из какого-то другого каталога, кроме того, в котором он находится!

5

Другие решения

Потому что во многих случаях относительный путь не будет работать, например, когда скрипт запускается из какой-то другой папки. С помощью __ DIR __ преобразует относительный путь в абсолютный путь, не оставляя места для путаницы.

Для вашего вопроса давайте предположим, что эта иерархия,

/
test/
test/script.php
test/Resource/config
another/

Сейчас script.php содержит этот путь, вы запускаете скрипт из каталога test поэтому относительный путь разрешен test/Resource/config, Это то, что вы хотели.

Но если вы запустите скрипт, скажем, anotherтогда путь будет разрешен до another/Resource/config что не правильно.

Если вы использовали __DIR__всегда разрешается в путь к сценарию, в котором он используется. Таким образом, относительный путь стал бы / test / Resource / config

Теперь независимо от того, откуда вы запускаете этот скрипт, поскольку путь является абсолютным, он не будет разрешен относительно и останется прежним.

6

По вопросам рекламы [email protected]