【问题标题】:Why many PHP developers use "__DIR__ . '../otherFolder'"?为什么许多 PHP 开发人员使用“__DIR__ .'../otherFolder'”?
【发布时间】:2016-01-22 02:06:03
【问题描述】:

我经常看到这种类型的代码__DIR__.'/../Resources/config'。但是为什么重点是,我错了,和输入../Resources/config'一样吗?

【问题讨论】:

  • 你是对的,在这种情况下,它是一样的。

标签: php relative-path dir


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 你能再详细点吗:)?
  • 我明白你的意思,但你能不能给我不同的例子?
  • @rickozoe:如果你理解它,我相信你可以花一些时间自己想出例子。你会在这个过程中学到一些东西。
  • 谢谢你!我现在明白了。
【解决方案2】:

不,它并不总是一样的。 __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__,它们就会被破坏。

无论何时编写脚本,都应确保从其所在目录以外的某个目录执行它是安全的!

【讨论】:

  • 谢谢,但您能提供更多用例吗?
  • 很难看出这怎么能更清楚,或者任何其他示例会显示什么
  • 这是您使用 DIR 的唯一原因吗?如果脚本是从其他目录执行的?您是否还有其他原因会使用 DIR
  • @Soujirou 我想在上课的情况下也是如此
  • @Soujirou:既然__DIR__(不是“DIR”)给你脚本的目录,按理说你用不用都会影响相关的东西到目录。真的,这似乎是一个绰绰有余的理由。大型 PHP 项目在各地都有来自不同目录的文件 included。
猜你喜欢
  • 1970-01-01
  • 2011-05-08
  • 2017-06-01
  • 2018-08-05
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多