我有一个带有工厂模式功能的类:
abstract class ParentObj {
public function __construct(){ ... }
public static function factory(){
//returns new instance
}
}
我需要子节点才能调用工厂函数并返回调用类的实例:$child = Child::factory();
,最好不要覆盖子类中的工厂函数。
我尝试过多种不同的方法来实现这一目标无济于事。我宁愿远离使用反射的解决方案,例如__CLASS__
。
(如果重要,我使用的是PHP 5.2.5)
答案 0 :(得分:12)
如果您可以升级到PHP 5.3(released 30-Jun-2009),请查看late static binding,这可以提供解决方案:
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();
答案 1 :(得分:-1)
以我的拙见,你所做的事情毫无意义。
工厂模式可以这样工作:
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');