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

时间:2014-08-23 06:43:09

标签: 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'); 

我问的原因是:如果单斜杠总是有效,为什么我在互联网上看到这么多的双斜线,即使是作曲家生成这样的文件[1]?有没有我遗失的案例?

[1] https://github.com/ircmaxell/quality-checker/blob/master/vendor/composer/autoload_namespaces.php

3 个答案:

答案 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()无论如何都会这样做。

另请参阅:Stringsvar_export()

相关问题