2010-01-17 52 views
3

在調用類中的靜態函數時,使用變量作爲類名稱時存在問題。我的代碼如下:PHP:作爲類實例的變量名稱

class test { 
    static function getInstance() { 
     return new test(); 
    } 
} 

$className = "test"; 
$test = $className::getInstance(); 

Ive得到定義類名的變量作爲類的名稱是從數據庫中來,所以我從來不知道什麼類創建的實例。

注:目前我收到以下錯誤:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM 

感謝

+0

有趣的是,您的代碼在PHP 5.3.1中適用於我,並且不會引發錯誤。 – 2010-01-17 20:51:18

+1

變量靜態類在PHP 5.3+中可用,任何更低的值都需要@hobodave提到的call_user_func()/ call_user_func_array() – Owen 2010-01-17 20:53:34

回答

8
$test = call_user_func(array($className, 'getInstance')); 

call_user_funccallbacks

+0

擊敗我。這是唯一的(也是唯一的)正確的方法。 – 2010-01-17 20:49:40

+0

只有在5.3以上的情況下,才能使用可變類名。 – StasM 2010-03-22 22:54:09

0

你可以使用reflection API,它可以讓你做這樣的事情:

$className = 'Test'; 
$reflector = new ReflectionClass($className); 
$method = $reflector->getMethod('getInstance'); 
$instance = $method->invoke(null); 

甚至:

$className = 'Test'; 
$reflector = new ReflectionClass($className); 
$instance = $reflector->newInstance(); 
// or $instance = $reflector->newInstanceArgs([array]); 
// or $instance = $reflector->newInstanceWithoutConstructor(); 

似乎都吸塵器給我的不僅僅是解釋字符串的值直接作爲類名或使用call_user_func和朋友。