这两个OOP场景之间的区别?

时间:2016-11-18 10:51:20

标签: php oop inheritance extends late-static-binding

我很困惑这两种情况之间的差异或性能提升。为什么要选择一个呢?

家长班:

class exampleB
{
    public function __construct($arg1, $arg2)
    {
        // Do something with the arguments.
    }
}

儿童A类

class exampleA extends exampleB
{
    public function make($arg1, $arg2)
    {
        parent::__construct($arg1, $arg2);
    }
}
  

运行第一个例子:

$exampleA = new exampleA();
$exampleA->make('arg1', 'arg2');

第二个例子是:

儿童A类

class exampleA extends exampleB
{
    public static function make($arg1, $arg2)
    {
        return new static($arg1, $arg2);
    }
}
  

运行第二个例子:

exampleA::make('arg1', 'arg2');

有人可以告诉我这两种情况之间的优点和/或缺点吗?我有这些例子的原因是因为我不想覆盖我父类的构造函数。

2 个答案:

答案 0 :(得分:2)

您既不应该使用构造函数来初始化对象。构造后,对象必须处于有效状态。

  

我有这些例子的原因是因为我不想覆盖我父类的构造函数。

然后只是不要在子类中定义构造函数。

class Parent {
    public function __construct() {
        echo 'parent ctor called';
    }
}

class Child extends Parent {}

new Child(); // echo's parent ctor called

答案 1 :(得分:-1)

我会选择第二个例子。 Make()的作用类似于构造函数,因此应该像一个一样调用,即静态。

在第一个示例中,您创建了两个对象而不是一个。当其他开发人员读取/保留您的代码时,这可能会产生一些混淆。