2011-05-27 70 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