$ obj = CLASE :: getInstance (). Luego inyectamos dependencias usando setters y realizamos la inicialización inicial usando $ obj-> initInstance ();
Creo que estás haciendo esto más difícil de lo que debe ser. Podemos inyectar dependencias perfectamente a través del constructor, y si tiene muchas de ellas, simplemente use una estructura similar a un diccionario para que pueda especificar cuáles quiere usar:
$obj = new CLASS(array(
'Frobnicator' => (),
'Foonicator' => (),
));
Y dentro del constructor, puede garantizar la coherencia de esta manera:
if (!array_key_exists('Frobnicator', $args)) {
throw new Exception('Frobnicator required');
}
if (!array_key_exists('Foonicator', $args)) {
$args['Foonicator'] = new DefaultFoonicator();
}
$args
luego se puede usar para establecer miembros privados según sea necesario.
Cuando se realiza por completo dentro del constructor de esta manera, nunca habrá un estado intermedio donde $obj
exista pero no se inicialice, como lo habría en el sistema descrito en la pregunta. Es mejor evitar tales estados intermedios, porque no puede garantizar que el objeto siempre se use correctamente.