$obj = CLASS::getInstance(). Then we inject dependencies using setters and perform starting initialization using $obj->initInstance();
I think you're making this more difficult than it needs to be. We can inject dependencies just fine through the constructor - and if you have a lot of them, just use a dictionary-like structure so you can specify what ones you want to use:
$obj = new CLASS(array(
'Frobnicator' => (),
'Foonicator' => (),
));
And within the constructor, you can ensure consistency like so:
if (!array_key_exists('Frobnicator', $args)) {
throw new Exception('Frobnicator required');
}
if (!array_key_exists('Foonicator', $args)) {
$args['Foonicator'] = new DefaultFoonicator();
}
$args
can then be used to set private members as necessary.
When done entirely within the constructor like so, there will never be an intermediate state where $obj
exists but is not initialized, as there would be in the system described in the question. It's better to avoid such intermediate states, because you can't guarantee the object is always going to be used correctly.