如何将公共构造函数转换为子类中的受保护?

时间:2011-03-27 07:26:20

标签: php singleton pdo visibility

我正在尝试扩展PDO类并将其转换为单例。唯一的问题是PDO的构造函数是公共的,PHP不会让我将它作为受保护的方法覆盖它。这有什么想象力的方法吗?如果我尝试这个,我会永远陷入那个松散的结局吗?另一种方法可能不是扩展PDO,而是将其保存在静态属性中,并使用它进行操作,但我希望我的类在可能的情况下保留PDO的所有功能。

2 个答案:

答案 0 :(得分:1)

您可以将PDO类包装在您自己的“Singleton Factory”对象中。基本上,您实现自己的包含(单个)PDO实例的单例。 (请注意,我不知道PHP语法,所以这是Java,但你应该能够理解这一点)

MySingletonFactory.getInstance().getPDO();

可以在此处找到更详细的解释:http://www.wikijava.org/wiki/Singleton_Factory_patterns_example

(再一次,Java ......抱歉 - 但我相信它会让你到达你想去的地方)

答案 1 :(得分:1)

试试这个:

class MyPdoSingleton {

    protected $pdo;

    // Your own constructor called the first time if the singleton
    // instance does not exist
    protected function __construct() {
    }

    // Always returns the same instance (singleton)
    public static function getInstance() {
        static $instance;
        return (is_object($instance)) ? $instance : $instance = new self();
    }

    // Redirect any non static methods calls made to this class to the contained
    // PDO object.
    public function __call($method, $args) {
        return call_user_func_array(array($this->pdo, $method), $args);
    }

    // 5.3+
    public function __callStatic($method, $args) {
        $inst = self::getInstance();
        return call_user_func_array(array($inst, $method), $args);
    }

    // Or if you intend to have other classes inherit from this one
    /*public function __callStatic($method, $args) {
        $class = get_called_class();
        $inst = call_user_func(array($class, 'getInstance'));
        return call_user_func_array(array($inst, $method), $args);
    }*/

    public function myOtherMethod($arg) {
         // __call would not get called when requesting this method
    }
}

// Pre 5.3 use
$db = MyPdoSingleton::getInstance();
$db->myOtherMethod();

// Post 5.3 use
MyPdoSingleton::myOtherMethod();

行动。我完全搞砸了。这就是我早上第一件回答问题的方法。