php - 在 PHP : What difference does a leading backslash make? 中导入类和命名空间

标签 php import namespaces language-specifications

这两者有什么区别:

use Exception;
use \Exception;

或者那些:

use Foo\Bar;
use \Foo\Bar;

manual说:

Note that for namespaced names (fully qualified namespace names containing namespace separator, such as Foo\Bar as opposed to global names that do not, such as FooBar), the leading backslash is unnecessary and not allowed, as import names must be fully qualified, and are not processed relative to the current namespace.

但我并不真正理解这一点,因为上述所有变体都有效,即它绝对不是“不允许的”。

查看 zend_do_use 表明,is_global(设置,当有前导反斜杠时)仅在以下情况下用于警告:

namespace {
    use Exception;
}

这告诉我:“使用非复合名称 'Exception' 的语句无效”。 (虽然对 use\Exception 做同样的事情会产生同样的影响,但不会引发警告。)

那么:我错过了什么吗?真的有区别吗?

最佳答案

手册将反斜杠指定为不需要,这自然意味着如果你仍然使用它,那么意思是等同的。但是,正如您所指出的,手册上说这是不允许的,这是错误的。

但是,手册还有其他问题。他们做广告:

// importing a global class
use \ArrayObject;

如果导入名称确实没有相对于当前命名空间进行处理,那么 use\ArrayObjectuse ArrayObject 必须具有相同的含义。除了全局对象之外,use ArrayObject 还能引用什么?实际上,引擎将导入全局引擎。

此外,还有这样的错误: http://bugs.php.net/bug.php?id=49143

我认为对于标准应该是什么存在混淆。

回答你的问题:没有区别。但是,如果我是引擎开发人员并且也是无前导斜杠标准的信徒,那么我就不需要考虑有人编写 use\Exception; 的情况。我相信情况很可能如此。

关于php - 在 PHP : What difference does a leading backslash make? 中导入类和命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4849279/

相关文章:

c++ - cout不是std的成员,其他关于c++的问题

php - MySQL:使用时间戳,如何转换为我的用户的时区?

php系统命令linux

java - 除了 Java 文件的开头之外,是否可以在任何地方使用 import 语句?

python - IPython/jupyter 笔记本中的自动更新模块

c++ - 如何在我的命名空间中使用 LoadString 宏?

c# - 如何在 C# 中将命名空间添加到 soap 信封

php - 如果满足条件,如何在函数内运行函数

php - 如何从数据库验证密码

R:按名称源函数/导入函数子集