Используйте вывод типов везде и всюду, где это возможно.
Редактировать:
Вот ссылка на запись в блоге, которую я написал несколько месяцев назад о том, почему я так себя чувствую.
http://blogs.msdn.com/jaredpar/archive/2008/09/09/when-to-use-type-inference.aspx
Если вы можете выполнить обновление до PHP 5.3 ( выпущен 30 июня 2009 г. ), ознакомьтесь с поздним статическим связыванием , которое может предоставить решение:
abstract class ParentObj {
public function __construct(){}
public static function factory(){
//use php5.3 late static binding features:
$class=get_called_class();
return new $class;
}
}
class ChildObj extends ParentObj{
function foo(){
echo "Hello world\n";
}
}
$child=ChildObj::factory();
$child->foo();
По моему скромному мнению, то, что вы пытаетесь сделать, не имеет смысла.
Заводской шаблон будет работать следующим образом:
abstract class Human {}
class Child extends Human {}
class Fool extends Human {}
class HumanFactory
{
public static function get($token)
{
switch ($token)
{
case 'Kid' : return new Child();
case 'King': return new Fool();
default : throw new Exception('Not supported');
}
}
}
$child = HumanFactory::get('Kid');