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

Php 实例化时静态类与类成员访问,php,object,global,static-methods,instantiation,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增加了

在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()逃脱,但当您走依赖注入路线时,您很可能希望创建某种工厂,以便在实例化时“注入那些依赖”。工厂可能是一个成熟的实例化对象,也可能只是一个静态方法,但事实是:如果您现在或将来需要将外部访问注入到类(数据库处理程序、设置)中,并且您不想滥用全局或单例(属于全局类…),你会非常感激你有一个方法/类,其中你的对象是实例化的,而不是分散在代码库中。

如果你的
->init()
就是这么做的,你可以不用
(新Foo)->bar(),但当您走依赖注入路线时,您很可能希望创建某种工厂,以便在实例化时“注入那些依赖”。工厂可能是一个成熟的实例化对象,也可能只是一个静态方法,但事实是:如果您现在或将来需要将外部访问注入到类(数据库处理程序、设置)中,并且您不想滥用全局或单例(属于全局类…),您将非常感谢您有一个方法/类,其中对象是实例化的,而不是分散在代码库中。

当您需要函数时,为什么要编写一个类?-也许两者都是同样糟糕的:你应该有两堆对象:一堆负责实例化其他对象,另一堆不关心。我在问题中提供的代码只是一个简单的例子,用来演示我所说的概念。你介意把你对两堆对象的评论再扩展一点吗?看看这里:,还有一个视频:-这两堆对象大约在24分钟左右,但整个视频都值得一看。当你需要一个函数时,为什么要编写一个类也许两者都是同样糟糕的:你应该有两堆对象:一堆负责实例化其他对象,另一堆不关心。我在问题中提供的代码只是一个简单的例子,用来演示我所说的概念。你介意把你对两堆物体的评论再扩展一点吗?看看这里:,还有一个视频:-这两堆物体大约在24分钟左右,但整个视频值得观看。