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

时间:2012-07-01 20:46:24

标签: php object global static-methods 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在实例化时支持类成员访问,这是在对象实例化后立即访问类成员的更正确方法吗?

2 个答案:

答案 0 :(得分:3)

是的,新的方式更正确,所以如果你能够使用它。不过,你之前拥有它的方式并不“糟糕”;对于令人沮丧的问题,这是一个干净,简单的解决方案。

答案 1 :(得分:1)

如果这只是->init()的全部,那么你可以使用(new Foo)->bar();,但是当你进入Dependancy Injection路线时,你很可能想要创建某种工厂来“注入那些依赖”在实例化。工厂可能是一个完整的实例化对象,或者只是一个静态的启动器方法,但事实是:如果您现在或将来需要外部访问注入您的类(数据库处理程序,设置),并且您不要想要滥用全局变量或单例(有点全局变量......),你会非常感谢你有一个方法/类,你的对象被实例化,而不是通过代码库。 / p>