在构造函数中立即采取行动有什么不对吗?

pes*_*taa 15 language-agnostic oop constructor

我有这样的课程:

class SomeObject
{
    public function __construct($param1, $param2)
    {
       $this->process($param1, $param2);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

所以我可以立即"称呼"它作为某种全局函数

new SomeObject($arg1, $arg2);
Run Code Online (Sandbox Code Playgroud)

这有什么好处

  • 保持简洁,
  • 容易理解,

但是可能会因为不等到方法被调用而破坏了不成文的语义规则.

我是不是应该因为不好的练习而感到不舒服,或者真的没什么值得担心的?

澄清:

  • 我确实想要一个类的实例.
  • 我只使用该类的内部方法.
  • 我在构造函数中初始化对象,但也调用"重要的"动作接受者方法.
  • 鉴于这些句子,我很自私.

例:

为了让您了解我通常如何使用此方法:

new Email('to@example.com', 'Subject line', 'Body Text');
Run Code Online (Sandbox Code Playgroud)

当然,我避免过度使用它,但在我看来,这非常方便.

Gre*_*ead 8

如果构造函数中的代码是创建和初始化对象的一部分,那么我会把它放在那里,但这就是我个人,有些人可能不同意

但是,看起来你正在做的不是用于构建对象/类,而是做其他一些过程.这很糟糕,应该在一个单独的方法中完成.

保持构造的构造.


Tyl*_*ter 5

这是一种不好的做法.

使用构造函数作为全局函数根本不是它的目的,而且很容易混淆.根本不容易理解.

如果你想要一个全局函数,请声明一个:

function myGlobalFunction(){ return $something; }
Run Code Online (Sandbox Code Playgroud)

真的不是那么难......

即使你没有将它用作函数,你也应该使用构造函数来构造一个对象.如果你做的不止于此,那么你并没有将它用于正确的目的,未来的贡献者可能很快会感到困惑.

因此,以某种方式编程是有道理的.这真的不是那么难.一些额外的击键可以为您节省很多困惑.

如果您需要在创建类的新实例后始终采取某些操作,请尝试工厂:

 class myFactory{
       public static function makeObject(){
           $obj = new Object();
           $obj->init1();
           return $obj;
       }
 }

 $obj = myFactory::makeObject();
Run Code Online (Sandbox Code Playgroud)