Ну, как всегда, нет единого размера, подходящего для всех.
Большую часть времени , класс FooBar
агрегирует $model1
и $model2
, потому что они нуждаются в них для выполнения своей функции. В этом сценарии FooBar
мало что может сделать, если у него нет объектов в этих переменных, поэтому правильно создать их в конструкторе.
Иногда агрегатный объект не требуется для выполнения большой части функции класса FooBar
, и создание этого объекта является дорогостоящей операцией. В этом случае имеет смысл создавать его только по требованию с помощью кода, подобного следующему:
class FooBar {
private $model1;
private $model2;
public function Frob() {
$model = $this->getModel1();
$model->frob();
}
private function getModel1() {
if ($this->model1 === null) {
$this->model1 = new Model1;
}
return $this->model1;
}
}
Однако это только , иногда . Если классу FooBar
требуется $model1
для половины его операций и $model2
для другой половины, это может указывать на то, что FooBar
страдает от случая "давайте бросим все в одном классе" и должен быть разбит на два классы вместо.