为什么许多PHP开发人员使用"__DIR__.'../otherFolder'"?

ric*_*zoe 5 php relative-path dir

我常常看到这种类型的代码__DIR__.'/../Resources/config'.但是为什么这一点,我错了,那就是打字一样../Resources/config'吗?

Aks*_*tap 6

因为在许多情况下相对路径不起作用,例如当脚本从其他文件夹运行时.使用__ DIR __将相对路径转换为绝对路径,不留任何混淆空间.

对于你的问题,我们假设这个层次结构,

/
test/
test/script.php
test/Resource/config
another/
Run Code Online (Sandbox Code Playgroud)

现在script.php包含此路径,您从目录运行脚本,test以便解析相对路径test/Resource/config.它是你想要的.

但是如果你从say运行脚本another,那么路径将被解析another/Resource/config为不正确.

如果你已经使用过__DIR__,它总是会被解析为它所使用的脚本的路径.所以相对路径将成为/ test/Resource/config

现在无论你从哪里运行这个脚本,由于路径是绝对的,它将不会相对解析并保持不变.


Lig*_*ica 6

不,它并不总是一样的.__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";
?>
Run Code Online (Sandbox Code Playgroud)

现在:

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

$ cd ~/
$ php foo/script.php
/home/me/foo/../bar
/home/me/bar
Run Code Online (Sandbox Code Playgroud)

如果我们摆脱__DIR__:

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

$ cd ~/
$ php foo/script.php
../bar
/home/bar
Run Code Online (Sandbox Code Playgroud)

请参阅......最后一条路径不正确.

如果我们在任何地方使用这些路径,它们就会被破坏__DIR__.

每当你编写一个脚本时,你应该确保从一个目录以外的目录执行它是安全的!