2011-05-27 299 views
3

現在我用Yii框架工作,我想寫下這樣的事情:PHP訪問的靜態成員

protected static $model = "Customer"; 
... 
public function actionIndex() { 
    $model::model()->find(... 

現在,它的工作原理:

protected static $model = "Customer"; 
protected static $model_obj; 
... 
public function __construct($controller, $id) { 
    $this->model_obj = new self::$model; 
... 
public function actionIndex() { 
    $model_obj::model()->find(... 

但創建對象對於訪問靜態成員是件壞事。 如何避免它?

的getClass需要對象作爲第一個參數,它不適合於這個目的

谷歌說:

$a = constant($myClassName . "::CONSTANT"); 
$b = call_user_func(array($myClassName, "static_method")); 

它看起來像狗屎可怕的和平。使用這可能會造成很多麻煩。另一個解

哦!我的問題是另一個:

$controller::$NAME::model() // error 

$controller_name = $controller::$NAME 
$controller_name::model() // good 

感謝

回答

6
class foo 
{ 
    public static function bar() 
    { 
    return 42; 
    } 
} 

// class name as string 

$class = 'foo'; 

var_dump($class::bar()); // 42 

// method name as string 

$method = 'bar'; 

var_dump(foo::$method()); // 42 

// class AND method names as strings 

var_dump($class::$method()); // 42 
+0

哦!我有另一個問題 – puchu 2011-05-27 17:18:39

+1

如果這回答您發佈的問題,請記住接受答案併發布您的其他問題在一個新的問題它也可以幫助其他用戶) – Lepidosteus 2011-05-27 17:22:26

0
call_user_func(array($myClassName, "static_method")); 

是這樣做的主要方式。我不太清楚爲什麼這會導致任何問題。

+1

compare call_user_func(array(「Customer」,「read」,$ id));與客戶::讀取($ id)=( – puchu 2011-05-27 17:09:35

+0

這是不可讀的 – puchu 2011-05-27 17:10:08