实例化的静态类与类成员访问


Static classes vs class member access on instantiation

在 5.4 之前的 PHP 版本中,我使用静态类来实例化对象并立即调用所需的函数,例如:

$result = Foo::init()->bar();

在上面的示例中,静态函数init()简单地实例化包含它的类,并将其作为对象返回。这提供了方法链接功能,并允许我立即调用bar(),所有这些都在一行代码中完成。静态函数init()如下所示:

static public function init() {
   $object = new self();
   return $object;
}

现在 PHP 5.4 增加了对实例化时类成员访问的支持,我现在可以执行以下操作,而不是使用静态类:

$result = (new Foo)->bar();


我的问题:我使用静态类的旧方法不好吗?如果是,为什么?既然 PHP 支持在实例化时访问类成员,那么这是在对象实例化后立即访问类成员的更正确方法吗?

是的,新方法更正确,所以如果可以的话,请使用它。不过,您以前拥有它的方式并不"糟糕";这是一个令人沮丧的问题的干净、简单的解决方案。

如果这就是你->init()所做的一切,你可以侥幸逃脱(new Foo)->bar();,但是当你走依赖注入路线时,你很可能希望创建某种工厂来在实例化时"注入那些迂腐"。工厂可能是一个完整的实例化对象,或者只是一个初学者的静态方法,但事实是:如果你现在或将来需要将外部访问注入到你的类(数据库处理程序、设置)中,并且你不想滥用全局或单例(这是一种全局...),你会非常感谢你有 1 个方法/类,你的对象被实例化,然后通过代码库洒落。