【问题标题】:Static classes vs class member access on instantiation静态类与实例化时的类成员访问
【发布时间】:2012-07-02 09:15:19
【问题描述】:

在 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 支持在实例化时访问类成员,这是不是在对象实例化后立即访问类成员的更正确的方式?

【问题讨论】:

  • 为什么需要函数的时候还要写一个类? - 可能两者都同样糟糕:你应该有两堆对象:那些注意实例化其他对象的对象,以及那些不关心的对象。
  • 我在问题中提供的代码只是一个简单的示例,用于演示我所谈论的概念。您是否介意进一步扩展您对两堆对象的评论?
  • 看这里:misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator,还有一个视频:youtube.com/watch?v=4F72VULWFvc - 两堆物体大约在24分钟左右,但整个视频值得一看。跨度>

标签: php object global static-methods instantiation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果这就是你的->init() 所做的一切,你可以使用(new Foo)->bar();,但是当你走依赖注入路线时,你很可能想要创建某种工厂来在实例化时“注入那些依赖”。工厂可能是一个完整的实例化对象,或者只是初学者的静态方法,但事实是:如果您现在或将来需要将外部访问注入到您的类(数据库处理程序、设置)中,并且您 不想想滥用全局变量或单例(它们是一种全局变量...),您将非常感谢您有 1 个方法/类,您的对象在其中被实例化,而不是散布在代码库中。

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多