我很困惑这两种情况之间的差异或性能增益是什么。为什么会选择一个而不是另一个呢?
父类:
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');
谁能告诉我这两种情况的优点和/或缺点?我之所以有这些例子,是因为我不想重写父类的构造函数。
您不应该这样做,而应该使用构造函数初始化对象。对象在构造后必须处于有效状态。
我之所以有这些例子,是因为我不想重写父类的构造函数。
那么就不要在子类中定义构造函数。
class Parent {
public function __construct() {
echo 'parent ctor called';
}
}
class Child extends Parent {}
new Child(); // echo's parent ctor called
我会选择第二个例子。Make()的行为类似于构造函数,因此应该像构造函数一样调用,即静态的。
在第一个示例中,您创建了两个对象而不是一个对象。当其他开发者阅读/维护你的代码时,这可能会造成一些混乱。