【问题标题】:How to use "root" namespace of php?如何使用 php 的“root”命名空间?
【发布时间】:2011-09-29 10:24:35
【问题描述】:

我有一个异常类:

namespace abc;

class AbcException extends Exception {
// blah blah
}

它会产生这个错误:

Class 'abc\Exception' not found ...

问题:

  1. 我可以做些什么来完成这项工作?

  2. 感谢您提供有用的文档。

感谢您阅读我的问题

【问题讨论】:

  • @Tomalak 不会根据封面来判断一本书。该问题中的 OP 询问“我如何从一个内部引用一个不属于任何命名空间的类?”这与此 OP 的问题完全相同。
  • @Gordon:这当然是高度相关的并且在同一个主题上,但我认为这两者看起来不同,足以将这个作为一个复制品关闭是有害的。不像其他一些引发下意识的近距离投票的主题一样,这个主题已经在 SO 上一遍又一遍地讨论了!
  • @Tomalak 相关性不高。是一样的 :) 答案是“在前面加上反斜杠”。是的,情况不同,但问题是相同的。就像所有这些询问如何解析网页中的所有 A 元素的问题与询问如何解析网页中的所有 LI 元素的问题一样。此外,就像您已经指出的那样,这很容易通过谷歌搜索找到,因此该问题无论如何都符合 Not A Real Question 的条件。
  • @Gordon:答案相同并不意味着问题相同。并且仅仅因为答案可以在互联网上找到并不意味着它“不是一个真正的问题”。

标签: php namespaces


【解决方案1】:

我能做些什么来完成这项工作?

使用前导反斜杠表示全局命名空间:

namespace abc;

class AbcException extends \Exception {
// blah blah
}

感谢有用的文件。

在 PHP 手册中有 an entire page 专门讨论这个!

【讨论】:

  • 谢谢,我不知道在手册上搜索这个问题的关键是什么:)
  • @nXqd:我在 Google 上搜索了“namespace php”,找到了第一个结果,然后单击了“使用命名空间:回退到全局函数/常量”,它完全描述了您要执行的操作!确实,在开始使用此语言功能之前,您应该在某个时候阅读过关于命名空间的整个手册部分。
  • 感谢 Tomalak,我第一次提出这个问题时感到很痛苦。但也许一整天的代码工作让我眼花缭乱:P
【解决方案2】:

Exception 类被解析为您的脚本命名空间 (PHP Manual),因为它的开头为:

namespace abc;

你可以具体告诉脚本使用哪个异常:

namespace abc;
use Exception;

class AbcException extends Exception {
// blah blah
}

使用此变体,您可以在文件顶部看到您“导入”的类。此外,您以后可以更轻松地更改/为文件中的每个异常类命名。另见Name resolution rules in the PHP Manual

或者,您可以在指定类名时指定具体命名空间。根命名空间是\,所以异常的全限定类名是\Exception

namespace abc;

class AbcException extends \Exception {
// blah blah
}

这适用于任何地方,但是,它会使您的代码更多地绑定到具体的类名,如果代码库增长并且您开始重构代码,这可能是不需要的。

【讨论】:

    【解决方案3】:

    在包含/扩展其他类 OR 库时最好使用“使用”。

    namespace AbcException;
    use Exception;
    
    class AbcException extends Exception {
        // Your Code
    }
    

    【讨论】:

      【解决方案4】:

      这只是一个黑斜线。像\Exception。

      【讨论】:

        【解决方案5】:

        在 windows 下,您不需要前导 \ 来表示根命名空间。部署到 *nix 环境后,无论何时使用它,都必须在类名前面显式添加 \,或者在使用它们之前为您正在使用的每个根命名空间类添加 use 语句,否则您将得到一个找不到类的致命错误。

        【讨论】:

          猜你喜欢
          • 2014-02-11
          • 1970-01-01
          • 2011-05-08
          • 2016-01-05
          • 1970-01-01
          • 2023-04-07
          • 2012-05-19
          • 2017-07-18
          • 2015-07-28
          相关资源
          最近更新 更多