根据动态变量引用模型类型时,解析运算符出错(PHP 5.2)

时间:2013-03-08 10:13:04

标签: php yii php-5.2 scope-resolution

背景资料:

我试图通过将子类中的常用函数移动到它们扩展的基类来简化我的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

问题:

  • 在这种情况下解析运算符在PHP 5.2上失败的原因是什么?和,
  • 是否有任何变通方法可以使这项工作具有相同的效果?

=================

其他信息:

我正在使用的全局modelname函数,它返回模型名称,即:“User”:

function modelname() {
    return Yii::app()->controller->id;
}

2 个答案:

答案 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