$ obj = CLASS :: getInstance (). Затем мы внедряем зависимости с помощью сеттеров и выполняем начальную инициализацию с помощью $ obj-> initInstance ();
Я думаю, ты делаешь это сложнее, чем нужно. Мы можем просто вставлять зависимости через конструктор - и если у вас их много, просто используйте словарную структуру, чтобы вы могли указать, какие из них вы хотите использовать:
$obj = new CLASS(array(
'Frobnicator' => (),
'Foonicator' => (),
));
А внутри конструктора вы можете обеспечить согласованность следующим образом:
if (!array_key_exists('Frobnicator', $args)) {
throw new Exception('Frobnicator required');
}
if (!array_key_exists('Foonicator', $args)) {
$args['Foonicator'] = new DefaultFoonicator();
}
$args
затем можно использовать для установки закрытых членов по мере необходимости.
Когда все сделано полностью в конструкторе, то так никогда не будет промежуточного состояния, где $obj
существует, но не инициализируется, как было бы в системе, описанной в вопросе. Лучше избегать таких промежуточных состояний, потому что вы не можете гарантировать, что объект всегда будет использоваться правильно.