2012-07-01 85 views
2

类的成员访问在PHP的之前的版本5.4 I使用的静态类实例化对象,并立即调用所需的功能,例如:静态类VS上实例化

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

在上面的例子中,静态函数init()只是实例化它所包含的类并将其作为对象返回。这提供了方法链接功能,并允许我立即在一行代码中调用bar()。静态函数init()看起来是这样的:

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

对实例化类成员访问现在PHP 5.4增加了支持,而不是使用一个静态类现在我可以做到以下几点:

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


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

+1

当你需要一个功能时,你为什么要写一个类? - 也许两者同样糟糕:你应该有两堆对象:那些照顾实例化别人的人,以及那些不在乎的人。 – hakre

+0

我在我的问题中提供的代码只是一个简单的例子来展示我正在谈论的概念。你想介绍一下你对两堆物品的评论吗? –

+2

看看这里:http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/,还有一个视频:http://www.youtube .com/watch?v = 4F72VULWFvc - 这两对物体大约在24分钟左右,但整个视频值得一看。 – hakre

回答

1

如果这就是你所有的->init()所做的,那么你可以通过(new Foo)->bar();逃脱,但是当你进入Dependancy Injection路由时,你很可能想创建某种Factory来在实例化时注入这些依赖关系。工厂可能是一个完整的实例化对象,或者只是一个静态的初学者方法,但事实是:如果你需要外部访问注入你的类(数据库处理程序,设置)现在或可能在未来,你don 't想要滥用全局变量或单例变量(这是一种全局变量...),你会非常感谢你有1个方法/类,其中你的对象被实例化,而不是通过代码库散布。

3

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