【问题标题】:Why don't class name fallback to global class name in namespaces?为什么类名不回退到命名空间中的全局类名?
【发布时间】:2020-06-19 23:41:11
【问题描述】:

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

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

我的问题是,如果类在当前命名空间中未定义时可以回退到全局类(如函数和常量),会有什么问题?这种设计选择在思想上或技术上的困难是什么?

【问题讨论】:

    标签: php function class design-patterns namespaces


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我最近发现here 如果未在当前命名空间中定义非限定类名,则会尝试自动加载。这似乎与您所说的矛盾“使用自动加载这可能会触发昂贵的操作,这基本上是无用的。”。而且,可能我的问题也是错误的,因为正在回退类。
    • 你能引用你在哪里读到的吗?类不应该回退。如果我将class Exception {} 放在全局范围内,我应该会得到一个错误,说我不能重新声明它
    • 在我在上面的评论中链接的同一个例子中,转到 class references 部分它说:new B(); // creates object of class "B" defined in namespace "A" // if not found, it tries to autoload class "A\B"
    • 这不是回退到全局命名空间。那就是命名空间“A”中没有定义“B”,所以我尝试在命名空间“A”中自动加载“B”。如果自动加载没有找到这样的类,它不会尝试使用全局命名空间中存在的“A”类。
    • 我想我误解了声明使用自动加载这可能会触发昂贵的操作,这基本上是无用的。。我认为这意味着由于自动加载很昂贵,因此不使用它。我认为这意味着,因为类使用自动加载——除此之外,回退到全局命名空间是一项昂贵的操作。
    猜你喜欢
    • 2021-01-02
    • 2014-06-24
    • 1970-01-01
    • 2014-04-07
    • 2018-04-25
    • 1970-01-01
    • 2018-07-24
    • 2012-12-26
    相关资源
    最近更新 更多