使用PHP命名空间时单斜杠还是双斜杠?

How*_*ard 6 php

以下几行调用名称间隔方法工作,是否有任何单斜杠不起作用的情况?

<?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

dec*_*eze 7

任何文字符号都可以使用单个反斜杠,这就是语法的定义方式:

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,你需要处理它们.

顺便说一句,这就是为什么许多人对\作为命名空间分隔符的选择非常不满意,因为它已经是一个具有特殊含义的字符,并导致混淆和可能的错误.


Aal*_*wlx 2

在PHP中,使用单引号[' ']时特殊字符不需要转义。大多数编程语言在使用双引号 [" "] 时都会检查 \t(制表符)、\n(换行符)、\r(回车符)和其他内容。当您在 PHP 中使用双引号时,它会搜索这些双引号,因此您必须转义特殊的反斜杠字符,以便 PHP 知道您没有转义反斜杠后面的字符。单引号的情况并非如此。

你可以自己测试一下:

echo "this\tis\ta\ttest";
echo 'this\tis\ta\ttest';
Run Code Online (Sandbox Code Playgroud)