以下几行调用名称间隔方法都有效,是否有单斜杠不起作用的情况?
<?php
namespace Foo\Bar;
class Dummy {
public static function hello() {
echo 'world';
}
}
echo \Foo\Bar\Dummy::hello();
call_user_func('\Foo\Bar\Dummy::hello');
call_user_func('\\Foo\\Bar\\Dummy::hello');
我问的原因是:如果单斜杠总是有效,为什么我在互联网上看到这么多的双斜线,即使是作曲家生成这样的文件[1]?有没有我遗失的案例?
[1] https://github.com/ircmaxell/quality-checker/blob/master/vendor/composer/autoload_namespaces.php
答案 0 :(得分:7)
任何文字符号都可以使用单个反斜杠,这就是语法的定义方式:
namespace Foo\Bar;
echo \Foo\Bar\Dummy::hello();
使用字符串时,string escaping rules适用:
call_user_func('Foo\Bar\Dummy::hello');
call_user_func('Foo\\Bar\\Dummy::hello');
(顺便说一句,在这些情况下不要以反斜杠开头,字符串中的完全限定类名始终是绝对的,您不需要使用起始反斜杠来解析相对名称空间引用。) < / p>
在单引号字符串中,只需要转义一个字符:'
。即如果你想用单引号写一个单引号,你需要用反斜杠转义它:
echo 'don\'t';
这会使反斜杠成为特殊字符,您可能也需要将其转义:
echo 'backslash: \\';
因此,在单引号字符串中,\\
始终是单个反斜杠。如果您使用单个反斜杠且下一个字符不是'
或\
,则该单个反斜杠也只是一个反斜杠:
echo 'just \ a \ backslash';
除了这两种情况外,它没有任何区别。
双引号字符串有更多转义序列,例如\n
,你需要处理它。
\
作为命名空间分隔符的选择非常不满意,因为它已经是一个具有特殊含义的字符,会导致混淆和可能的错误。
答案 1 :(得分:2)
在PHP中,使用单引号['']时不需要转义特殊字符。当使用双引号[“”]时,大多数编程语言检查\ t(制表符),\ n(新行),\ r \ n(回车符)和其他语言。当您在PHP中使用双引号时,它会搜索这些,因此您必须转义特殊的反斜杠字符,以便PHP知道您在反斜杠后没有转义该字符。单引号不是这种情况。
您可以自己测试一下:
echo "this\tis\ta\ttest";
echo 'this\tis\ta\ttest';
答案 2 :(得分:2)
在单引号字符串中,您只需要使用反斜杠来转义单引号或反斜杠(如果它显示为最后一个字符),例如'foo\\'
。
在您的示例中,this line突出显示了这个确切的情况:
'Symfony\\Component\\Routing\\' => $vendorDir . '/symfony/routing/', ^^
顺便提一下,这也是var_export()
:
$a = ['foo\bar\baz\\' => 'foo'];
var_export($a);
array (
'foo\\bar\\baz\\' => 'foo',
)
所以尽管在上面的例子中,技术上没有必要逃避其他反斜杠,var_export()
无论如何都会这样做。
另请参阅:Strings
和var_export()