首页 > 解决方案 > 为什么类名不回退到命名空间中的全局类名?

问题描述

我一直在阅读Using namespaces: fallback to global function/constant on php.net,它说该语言是按以下方式设计的:

类名总是解析为当前的命名空间名。因此,要访问内部或非命名空间的用户类,必须使用它们的完全限定名称来引用它们...... .....对于函数和常量,如果命名空间函数或常量,PHP 将回退到全局函数或常量不存在。

我的问题是,如果类可以回退到全局类,比如函数和常量,当它们没有在当前命名空间中定义时,会有什么问题?该设计选择的意识形态或技术困难是什么?

标签: phpfunctionclassdesign-patternsnamespaces

解决方案


它与自动加载和性能有关。

来自关于命名空间解析的RFC :

这里一个值得注意的方面是我们有自动加载的类。如果非完全限定标识符可用于引用全局标识符,“懒惰”程序员可以跳过完全限定标识符,即使他们完全打算引用全局标识符。使用自动加载,这可能会触发昂贵的操作,这些操作基本上是无用的。

但是对于函数,我们没有自动加载功能。这带来了回退到全局命名空间不会运行自动加载的性能风险的优势。因此,回退会便宜得多,但仍然会有不故意引用完全限定的全局命名空间的开销。


推荐阅读