使用PHP名称空间时使用单斜杠还是双斜杠?
下面两行调用name spaced方法都有效,是否存在单斜杠不起作用的情况使用PHP名称空间时使用单斜杠还是双斜杠?,php,Php,下面两行调用name spaced方法都有效,是否存在单斜杠不起作用的情况 <?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\\
<?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');
在PHP中,使用单引号[“”]时不需要转义特殊字符。大多数编程语言在使用双引号[“”]时检查\t(制表符)、\n(新行)、\r(回车符)和其他内容。当您在PHP中使用双引号时,它会搜索这些字符,因此您必须转义特殊的反斜杠字符,以便PHP知道您没有转义反斜杠后面的字符。单引号的情况并非如此
您可以自己进行测试:
echo "this\tis\ta\ttest";
echo 'this\tis\ta\ttest';
在单引号字符串中,您只需要使用反斜杠来转义单引号,或者如果反斜杠作为最后一个字符出现,则只需使用反斜杠,例如'foo\\\'
在您的示例中,突出显示了这种情况:
顺便说一句,这也是var\u export()
的输出:
因此,尽管从技术上讲,在上面的示例中没有必要跳过其他反斜杠,var\u export()
仍将执行此操作
另请参见:和任何文字符号的工作原理与单个反斜杠相同,这就是语法的定义方式:
namespace Foo\Bar;
echo \Foo\Bar\Dummy::hello();
使用字符串时,应用:
(顺便说一句,在这些情况下,不要以反斜杠开头,字符串中的完全限定类名始终是绝对的,解析相对命名空间引用时不需要起始反斜杠。)
在单引号字符串中,只需转义单个字符:“
。也就是说,如果你想在单引号中写单引号,你需要用反斜杠转义:
echo 'don\'t';
echo 'just \ a \ backslash';
这使得反斜杠成为一个特殊字符,您可能还需要转义:
echo 'backslash: \\';
因此,在单引号字符串中,\\
始终是一个反斜杠。如果使用的是单个反斜杠,而下一个字符不是'
或\
,则该单个反斜杠也只是单个反斜杠:
echo 'don\'t';
echo 'just \ a \ backslash';
因此,除了这两种情况,这没有区别
双引号字符串有更多的转义序列,如\n
,您需要处理这些转义序列
顺便说一句,这就是为什么许多人对选择\
作为名称空间分隔符感到非常不满意,因为它已经是一个具有特殊含义的字符,并且会导致混淆和可能的bug 谢谢。当我看到composer正在生成像'Symfony\\Component\\Yaml'=>$vendorDir'这样的自动加载php文件时,会感到困惑/symfony/yaml/…
是的,在这种情况下,不必严格地使用反斜杠,但它确实不会影响到。谢谢,我更新了我的问题,参考了composer generate autoload php文件,为什么他们在单引号字符串中使用“\\”?@Howard更新了我的答案,特别涉及到这个主题。
echo 'just \ a \ backslash';