2009-09-08 61 views
0

我需要使用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(); 
    } 
} 

我會再次檢查所有的代碼,因爲必須有一個循環的地方。回到繪圖板,我去:(

+1

不要在PHP5中使用引用運算符(&)和類,這是不贊成的(雖然它不會保存你的問題,我猜測) – knittl 2009-09-08 12:20:49

+0

可能只是一個錯字而不是問題的根源,但是'loadLibrary'方法需要'$ lib'作爲參數,但是在代碼中引用'$ class'。 – 2009-09-08 12:51:42

回答

2

你應該確定它是什麼,需要你開始陷入無限循環。請問您的構造函數(someLibrary::__construct())有直接/間接調用Library::getInstance(),例如任何代碼?

編輯get_called_class()是在PHP 5.3中引入的,所以如果你的代碼真的有效,你已經運行5.3

0

,你可以嘗試用eval()解決這個

爲了讓你的想法:

$theVar = "relvantClassName"; 
$someObject = eval($theVar::getInstance()); 
$result = $someObject->performAction();