這天考慮用php來singleton一下,看到一篇比較全面的總結-- singleton模式的幾種實現.其中總結的php5的實現:
PLAIN TEXTPHP:
class MyClass
{
private static $instance;
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
}
這段程式碼拿來使用,不會太爽,因為一般都會繼承自MyClass,而$c = __CLASS__;取得的總是基底類別的類別名,不可用。只能考慮找其它實作方法。
接著俺開始查看文章中的函數方式實作的singleton,實作的很不錯,缺點是類別被實例化時不能帶參數,這裡貼上俺的版本:
PLAIN TEXTPHP:
function getObj() {
static $obj = array();
$args = func_get_args();
if(empty($args))
return null;
$clazz = $args[0];
if(!is_object($obj[$clazz])) {
$cnt = count($args);
if($cnt> 1) {
for($i = 1, $s = ''; $i <$cnt; $i++)
$s[] = '$args[' . $i . ']';
eval('$obj[$clazz] = new $clazz(' . join(',', $s) . ');');
} else {
$obj[$clazz] = new $clazz;
}
}
return $obj[$clazz];
}
在php5下可以很酷的呼叫:
PLAIN TEXTPHP:
getObj('MyClass', $param1, $param2)->myMethod();
以前的幼稚版:
單子模式(SINGLETON)的簡單實作