在PHP中使用私有构造函数扩展类,不同于版本5.1到5.4

时间:2014-04-03 20:05:01

标签: php class oop inheritance extend

我有一个带私有构造函数的类,以防止直接实例化。

class MyClass {

    private static $instance;

    private function __construct() {

    }

    public static function getInstance() {
        if (isset(self::$instance)) {
            return self::$instance;
        } else {
            $c = __CLASS__;
            self::$instance = new $c;
            return self::$instance;
        }
    }

}

我延长它

class ExtendedClass Extends MyClass {
    //cannot touch parent::$instance, since it's private, so must overwrite
    private static $instance;
    //calling parent::getInstance() would instantiate the parent, 
    //not the extension, so must overwrite that too
    public static function getInstance() {
        if (isset(self::$instance)) {
            return self::$instance;
        } else {
            $c = __CLASS__;
            self::$instance = new $c;
            return self::$instance;
        }
    }
}

当我打电话

$myInstance=ExtendedClass::getInstance();

在PHP 5.4.5中,我得到了

  

PHP致命错误:从上下文调用私有MyClass :: __ construct()   ' ExtendedClass'

但是在PHP 5.1.6中,一切都按预期工作

这里发生了什么?

另外:我没有写MyClass,我没有能力保护构造函数,如果我这样做就能解决问题,但我不能。

1 个答案:

答案 0 :(得分:2)

the bug。您可以像这样修改代码(PHP> PHP5.3):

class MyClass {

    private static $instance;

    private function __construct() {

    }

    static function getInstance() {
        if (isset(self::$instance)) {
            return self::$instance;
        } else {
            self::$instance = new static();
            return self::$instance;
        }
    }

}


class ExtendedClass Extends MyClass {
}