Я не понимаю, какая разница или выигрыш в производительности будут между этими двумя сценариями. Почему один будет выбран над другим?
Родительский класс:
class exampleB
{
public function __construct($arg1, $arg2)
{
// Do something with the arguments.
}
}
Детский класс А
class exampleA extends exampleB
{
public function make($arg1, $arg2)
{
parent::__construct($arg1, $arg2);
}
}
Запуск первого примера:
$exampleA = new exampleA();
$exampleA->make('arg1', 'arg2');
Второй пример будет:
Детский класс А
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 () действует как конструктор и поэтому должен вызываться как один, то есть static.
В первом примере вы создаете два объекта вместо одного. Это может создать некоторую путаницу, когда другие разработчики читают / поддерживают ваш код.