Вы не можете создать объект класса-потомка при вызове конструктора класса-предка, поэтому этот код не будет работать так, как вы хотите.
$test = new \DefaultNameSpace\defaultClass('Two');
Чтобы достичь желаемого, вы можете использовать Factory
pattern . Упрощенный (и очень примитивный) пример:
function factoryMethod($type){
$result = null;
switch($type){
case 1:
$result = new Class1();
break;
case 2:
$result = new Class2();
break;
default:
$result = new ClassDefault();
break;
}
return $result;
}
$obj = factoryMethod(2);
$obj->printInvoice();
Обратите внимание, что вы полностью ответственны за возврат из factoryMethod
объектов, которые реализуют требуемый интерфейс, так как PHP не поддерживает подсказки типа возврата (насколько я знаю).