在 PHP 中导入类和命名空间:前导反斜杠有什么区别?

这两者之间有什么区别:

use Exception;
use \Exception;

或者那些:

use Foo\Bar;
use \Foo\Bar;

手册说:

请注意,对于命名空间名称(包含命名空间分隔符的完全限定命名空间名称,如 Foo\Bar,而不是不包含命名空间的全局名称,如 FooBar),前导反斜杠是不必要的,也是不允许的,因为导入名称必须是完全限定的,并且不相对于当前命名空间进行处理。

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

查看显示,(设置,当存在前导反斜杠时)仅用于在以下情况下的警告:zend_do_useis_global

namespace {
    use Exception;
}

它告诉我:“具有非复合名称'Exception'的使用声明没有效果”。(虽然做同样的事情会同样没有效果,但不会发出警告。use \Exception

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


答案 1

手册将反斜杠指定为不必要的,这自然意味着如果您仍然使用它,则含义是等效的。但是,正如您所指出的,手册说它被认为是不允许的,这是错误的。

但是,该手册还有其他令人不安的事情。他们宣传这个:

// importing a global class
use \ArrayObject;

如果确实未相对于当前命名空间处理导入名称,则 并且必须具有相同的含义。除了全球性的之外,还有什么可以参考的呢?在实践中,引擎将导入全局引擎。use \ArrayObjectuse ArrayObjectuse ArrayObject

另外,对于这样的错误:http://bugs.php.net/bug.php?id=49143

我认为人们对标准应该是什么感到困惑。

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


答案 2

事实上,目前在导入命名空间时使用前导反斜杠没有区别,PHP手册中的信息也发生了变化:

请注意,对于命名空间名称(包含命名空间分隔符的完全限定命名空间名称,如 Foo\Bar,而不是不包含命名空间的全局名称,如 FooBar),前导反斜杠是不必要的,也不建议使用,因为导入名称必须是完全限定的,并且不会相对于当前命名空间进行处理。

因此,现在有真实信息表明不建议使用前导反斜杠,但没有信息表明过去不允许这样做。

所以目前:

use Exception;
use \Exception;

这2行的工作原理相同,但您应该使用第一行。


推荐