我需要使用Singleton設計調用一個對象的靜態函數,但使用變量作爲類名稱。PHP:使用變量名稱來調用Singleton對象上的靜態函數
最好的方法$class::getInstance();
僅在PHP 5.3中可用,而我發現的另一種方式call_user_func(array($class, 'getInstance'));
導致最大執行時間被破壞。有誰知道爲什麼會發生這種情況,或者有什麼辦法可以解決這個問題?
我知道這不是做事情的最佳方式,Singleton設計模式不會是我的第一選擇,但不幸的是這不取決於我。
在此先感謝任何人誰有助於:)
包括我的代碼所涉及的其餘部分:
abstract class Library
{
protected function __construct(){}
final private function __clone(){}
final public static function &getInstance()
{
static $libs = array();
$lib = get_called_class();
if(!isset($libs[$lib])) $libs[$lib] = new $lib();
return $libs[$lib];
}
}
public function &loadLibrary($lib)
{
// Filter $lib, and load the library class file...
// Following only works in PHP 5.3
// return $lib::getInstance();
// Following results in maximum execution time being breached.
return call_user_func(array($lib, 'getInstance'));
}
}
$someLibrary =& loadLibrary('someLibrary');
someLibrary.php:
class someLibrary extends Library
{
protected function __construct(){}
// Code...
}
Soulmerge做出正確的觀點說get_called_class()
只在PHP 5.3中使用,因此我必須使用它,但是,唉,我只是像往常一樣欺騙我的方式(感謝來自的Chris Webb的代碼 - 太複雜了,我自己的!)。
if(!function_exists('get_called_class'))
{
class classTools
{
static $i = 0;
static $fl = null;
static function get_called_class()
{
$bt = debug_backtrace();
if(self::$fl == $bt[2]['file'].$bt[2]['line']) self::$i++;
else {
self::$i = 0;
self::$fl = $bt[2]['file'].$bt[2]['line'];}
$lines = file($bt[2]['file']);
preg_match_all('/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/', $lines[$bt[2]['line']-1], $matches);
return $matches[1][self::$i];
}
}
function get_called_class()
{
return classTools::get_called_class();
}
}
我會再次檢查所有的代碼,因爲必須有一個循環的地方。回到繪圖板,我去:(
不要在PHP5中使用引用運算符(&)和類,這是不贊成的(雖然它不會保存你的問題,我猜測) – knittl 2009-09-08 12:20:49
可能只是一個錯字而不是問題的根源,但是'loadLibrary'方法需要'$ lib'作爲參數,但是在代碼中引用'$ class'。 – 2009-09-08 12:51:42