为什么许多 PHP 开发人员使用“__DIR__ . '../otherFolder'”?
Why many PHP developers use "__DIR__ . '../otherFolder'"?
我经常看到这种类型的代码 __DIR__.'/../Resources/config'
。但是为什么要点,我错了吗,输入 ../Resources/config'
是一样的吗?
因为在许多情况下,相对路径不起作用,例如当脚本是来自其他文件夹的 运行 时。使用 __ DIR __ 将相对路径转换为绝对路径,不留下任何混淆的 space。
对于你的问题,让我们假设这个层次结构,
/
test/
test/script.php
test/Resource/config
another/
现在 script.php
包含此路径,您 运行 目录 test
中的脚本因此相对路径解析为 test/Resource/config
。就是你想要的。
但是如果您 运行 来自 another
的脚本,那么路径将被解析为 another/Resource/config
,这是不正确的。
如果您使用了 __DIR__
,它总是被解析为使用它的脚本的路径。因此相对路径将变为 /test/Resource/config
现在无论你从哪里运行这个脚本,由于路径是绝对的,它不会相对解析并且会保持不变。
不,这并不总是一回事。 __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__.'/../Resources/config'
。但是为什么要点,我错了吗,输入 ../Resources/config'
是一样的吗?
因为在许多情况下,相对路径不起作用,例如当脚本是来自其他文件夹的 运行 时。使用 __ DIR __ 将相对路径转换为绝对路径,不留下任何混淆的 space。
对于你的问题,让我们假设这个层次结构,
/
test/
test/script.php
test/Resource/config
another/
现在 script.php
包含此路径,您 运行 目录 test
中的脚本因此相对路径解析为 test/Resource/config
。就是你想要的。
但是如果您 运行 来自 another
的脚本,那么路径将被解析为 another/Resource/config
,这是不正确的。
如果您使用了 __DIR__
,它总是被解析为使用它的脚本的路径。因此相对路径将变为 /test/Resource/config
现在无论你从哪里运行这个脚本,由于路径是绝对的,它不会相对解析并且会保持不变。
不,这并不总是一回事。 __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__
,它们就会被破坏。
无论何时编写脚本,都应确保从其所在目录以外的某个目录执行它是安全的!