我正在尝试扩展PDO类并将其转换为单例。唯一的问题是PDO的构造函数是公共的,PHP不会让我将它作为受保护的方法覆盖它。这有什么想象力的方法吗?如果我尝试这个,我会永远陷入那个松散的结局吗?另一种方法可能不是扩展PDO,而是将其保存在静态属性中,并使用它进行操作,但我希望我的类在可能的情况下保留PDO的所有功能。
答案 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();
行动。我完全搞砸了。这就是我早上第一件回答问题的方法。