请甄别文章的时效性。
这篇文章最后更新于 11 年前 ,其中所记录的信息可能已经不再合理或有效。如有任何建议,欢迎与我联系。
目前的一个项目有几个模块需要实现单例模式,于是想实现一个 Singleton 基类来使这些模块通过继承该基类实现 Singleton。
<?php
class Singleton
{
protected static $instances;
public static function getInstance()
{
if(!isset(self::$instances)) {
self::$instances = new __CLASS__;
}
return self::$instances;
}
protected function __construct() { }
protected function __clone() { }
}
这是一个 Singleton 的 PHP 实现,然而这时希望通过如下代码使 Database 类实现 Singleton 是不可行的:
<?php
class Database extends Singleton { }
因为 __CLASS__
获得的永远只是父类(Singleton)而不是子类,所以无法获知子类类信息,自然也就无法实现子类的单例。
PHP5.3 提供了get_called_class()
函数,用过此函数可以实现 Singleton 的继承。
其它实现方式
为了能在 PHP5.3 以前实现 Singleton 的继承,我们可以定义一个静态数组来维护类的实例,定义以及使用方法如下:
<?php
class Singleton
{
protected static $instances = array();
public static function getInstance($className)
{
if(!isset(self::$instances[$className])) {
self::$instances[$className] = new $className;
}
return self::$instances[$className];
}
protected function __construct() { }
protected function __clone() { }
}
class Database extends Singleton
{
public function hello()
{
echo 'hello';
}
}
Singleton::getInstance('Database')->hello();