从父类实例化子类(PHP)

时间:2009-06-29 19:47:18

标签: php oop

我有一个带有工厂模式功能的类:

abstract class ParentObj {
    public function __construct(){ ... }
    public static function factory(){
        //returns new instance
    }
}

我需要子节点才能调用工厂函数并返回调用类的实例:$child = Child::factory();,最好不要覆盖子类中的工厂函数。

我尝试过多种不同的方法来实现这一目标无济于事。我宁愿远离使用反射的解决方案,例如__CLASS__

(如果重要,我使用的是PHP 5.2.5)

2 个答案:

答案 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');