【问题标题】:Why is stdClass namespaced?为什么 stdClass 是命名空间的?
【发布时间】:2012-10-08 12:07:19
【问题描述】:

传递给 nms\aclass::__construct() 的参数 1 必须是一个实例 nms\stdClass 的实例,给定的 stdClass 实例

__construct() 函数看起来像 public function __construct(stdClass $aclass)

我得到了错误,我从全局命名空间中传递了一个 stdClass 的实例,而不是来自同一个命名空间中的一个实例,

我也得到了解决方案:public function __construct(\stdClass $aclass)

但我不明白的是为什么?我认为甚至不可能覆盖 stdClass 是吗?那么\stdClass\nms\stdClass 之间有什么区别?

【问题讨论】:

  • 当您已经声明了一个命名空间时,我相信与该文件/类一起使用的任何内容都假定在该声明的命名空间内。因此,要在全局中使用某些内容,您需要使用 \ 显式引用它。
  • 除非你的班级正在做一些非常通用的事情,否则我会质疑输入stdClass 的价值。您肯定对您期望的对象类型有足够的了解,可以给它一个更有用的类型提示吗?
  • 基本上它在代码点火器内部,该类期望的是数据库查询的结果,CI返回为stdClass,基本上,这里的类型提示是因为如果它不是一个对象传入然后有人搞砸并通过了一个空的结果集或一个失败或类似的查询,它比其他任何东西都更基本的错误检查。不管这比关于类型提示 stdClass 的value 更普遍的问题!

标签: php namespaces stdclass


【解决方案1】:

当然可以在命名空间内覆盖stdClass

namespace Example;

class stdClass {
    public function __construct() {
        echo "Overridden!";
    }
}

$global = new \stdClass();
$local = new stdClass;

输出:

Overridden!

因此,如果您想要原始文件,则需要使用 /stdClass 全局命名空间。很像/Exceptions。

【讨论】:

  • 啊,好吧,我以为它会给你一个可爱的Cannot redeclare class stdClass in ...错误!但不,仔细想想,这就是命名空间的目的!
  • @Hailwood:确实如此。甚至本地函数也可以从命名空间内部重新声明。
猜你喜欢
  • 2011-03-23
  • 2011-04-24
  • 1970-01-01
  • 2011-10-12
  • 2013-06-04
相关资源
最近更新 更多