以下几行调用名称间隔方法工作,是否有任何单斜杠不起作用的情况?
<?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');
Run Code Online (Sandbox Code Playgroud)
我问的原因是:如果单斜杠总是工作,为什么我在互联网上看到这么多的双斜线,即使是作曲家生成这样的文件[1]?有什么事我错过了吗?
[1] https://github.com/ircmaxell/quality-checker/blob/master/vendor/composer/autoload_namespaces.php
任何文字符号都可以使用单个反斜杠,这就是语法的定义方式:
namespace Foo\Bar;
echo \Foo\Bar\Dummy::hello();
Run Code Online (Sandbox Code Playgroud)
使用字符串时,字符串转义规则适用:
call_user_func('Foo\Bar\Dummy::hello');
call_user_func('Foo\\Bar\\Dummy::hello');
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,在这些情况下不要以反斜杠开头,字符串中的完全限定类名始终是绝对的,您不需要起始反斜杠来解析相对名称空间引用.)
在单引号字符串中,只需要转义一个字符:'.即如果你想用单引号写一个单引号,你需要用反斜杠转义它:
echo 'don\'t';
Run Code Online (Sandbox Code Playgroud)
这使得反斜杠成为一个特殊的角色,你也可能需要逃脱:
echo 'backslash: \\';
Run Code Online (Sandbox Code Playgroud)
因此,在单引号字符串中,\\始终是单个反斜杠.如果您使用单个反斜杠并且下一个字符不是'或者\,则该单个反斜杠也只是一个反斜杠:
echo 'just \ a \ backslash';
Run Code Online (Sandbox Code Playgroud)
所以除了这两种情况外,它没有任何区别.
双引号字符串有更多的转义序列\n,你需要处理它们.
顺便说一句,这就是为什么许多人对\作为命名空间分隔符的选择非常不满意,因为它已经是一个具有特殊含义的字符,并导致混淆和可能的错误.
在PHP中,使用单引号[' ']时特殊字符不需要转义。大多数编程语言在使用双引号 [" "] 时都会检查 \t(制表符)、\n(换行符)、\r(回车符)和其他内容。当您在 PHP 中使用双引号时,它会搜索这些双引号,因此您必须转义特殊的反斜杠字符,以便 PHP 知道您没有转义反斜杠后面的字符。单引号的情况并非如此。
你可以自己测试一下:
echo "this\tis\ta\ttest";
echo 'this\tis\ta\ttest';
Run Code Online (Sandbox Code Playgroud)