不,它并不总是一样的. __DIR__是文件的目录,而不是当前的工作目录.该代码本质上是动态生成的绝对路径.
把它写入〜/ foo / script.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__的情况下被破坏.
每当你编写一个脚本时,你应该确保从一个目录以外的目录执行它是安全的!