背景资料:
我试图通过将子类中的常用函数移动到它们扩展的基类来简化我的Yii应用程序的结构。
我将loadModel($id)
函数从User(子)控制器移动到Base控制器中。
之前,在UserController.php中。这有效:
public function loadModel($id) {
$model = User::model()->findByPk($id);
if ($model === null)
throw new CHttpException(404, 'The requested page does not exist.');
return $model;
}
之后,我删除了上面的函数,并将它放入了由UserController继承的Controller.php以及其他许多函数:
public function loadModel($id) {
$type = modelname(); // returns a string, i.e.: "User"
$model = $type::model()->findByPk($id);
if ($model === null)
throw new CHttpException(404, 'The requested page does not exist.');
return $model;
}
问题:
我在我的本地PC上试过这个,运行PHP 5.4.4, 按预期工作 ,但是当它上传到运行PHP 5.2的测试服务器时,这会引发HTTP错误500(内部服务器错误)。在查看错误日志时,错误为PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
错误,指的是第三行的resolution operator。
问题:
=================
其他信息:
我正在使用的全局modelname函数,它返回模型名称,即:“User”:
function modelname() {
return Yii::app()->controller->id;
}
答案 0 :(得分:1)
我在这里找到了答案:
http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php
范围解析运营商(也称为Paamayim Nekudotayim)或 更简单的术语,双冒号,是一个允许访问的标记 静态,常量和重写的属性或类的方法。
从类定义外引用这些项时,请使用 这个班的名字。
从PHP 5.3.0开始,可以使用a引用该类 变量。变量的值不能是关键字(例如self,parent 和静态)。
基本上,我必须升级PHP版本才能动态引用类。
答案 1 :(得分:1)
实际上,您无需升级即可动态引用该类。 Yii没有,yii支持PHP 5.2。如果你有兴趣,我可以看看我是否可以挖掘它是如何完成的,但我遇到了同样的问题并在PHP 5.2上解决了它
编辑: 好的,这是信息。我在Yii wiki page.
上发布了原始信息这是返回Yii单例模型的代码:
$thisModel = call_user_func($modelname, 'model');
但是,根据DCoder,CActiveRecord::model($modelname)
看起来也会起作用:
Yii info here:http://www.yiiframework.com/doc/api/1.1/CActiveRecord#model-detail