在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在实例化时支持类成员访问,这是在对象实例化后立即访问类成员的更正确方法吗?
答案 0 :(得分:3)
是的,新的方式更正确,所以如果你能够使用它。不过,你之前拥有它的方式并不“糟糕”;对于令人沮丧的问题,这是一个干净,简单的解决方案。
答案 1 :(得分:1)
如果这只是->init()
的全部,那么你可以使用(new Foo)->bar();
,但是当你进入Dependancy Injection路线时,你很可能想要创建某种工厂来“注入那些依赖”在实例化。工厂可能是一个完整的实例化对象,或者只是一个静态的启动器方法,但事实是:如果您现在或将来需要外部访问注入您的类(数据库处理程序,设置),并且您不要想要滥用全局变量或单例(有点全局变量......),你会非常感谢你有一个方法/类,你的对象被实例化,而不是通过代码库。 / p>