使用私有构造函数扩展类型?

时间:2013-05-28 08:47:18

标签: php oop singleton

我想为框架提供的类型添加一些功能,但这种类型是singleton

因此,它的构造函数是私有的。我的课也应该是singleton,但我不知道如何初始化它。我不能改变原始类的代码。

现在我没有扩展,只保留一个在我的getInstance中初始化的私有属性,并使用__call(),但它不够用而且不直观。我不能传递我期望的originall类的对象。

1 个答案:

答案 0 :(得分:0)

您需要将扩展​​类中的构造函数保持为私有。但是,您可以执行以下操作:

class originalClass
{
    private function __construct()
    {
        /* Do something */
    }

    public static function init()
    {
        self::__construct();
     }
}


class extendedClass extends originalClass
{
    private function __construct()
    {
        parent::init();
    }

    public static function init()
    {
        self::__construct();
    }
}

$var = extendedClass::init();

或者,您可以选择将您的课程作为独立课程,并使用魔术方法访问“父”对象:

class pdoExtender
{
    private $someProperty;

    public function __construct()
    {
        $this->someProperty = new PDO(...);
    }

    public function __call($name, $args)
    {
        if(method_exists(array($this, $someProperty), $name))
        {
            return call_user_func_array(array($this, $someProperty), $args);
        }
    }
}

// Example function calls:
    $db = new pdoExtender;

    // As (obj)pdoExtender doesn't have the method 'prepare()', the __call() method is invoked to check the 'parent' object, PDO
    $db->prepare();