-8

背景资料:

我试图通过将一个公共函数从子类移动到它们扩展的基类来简化我的 Yii 应用程序的结构。

我将loadModel($id)功能从用户(子)控制器移动到基本控制器。

之前,在 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;
}

之后,我把上面的函数去掉了,放到Controller.php里面,UserController继承的,还有很多其他的:

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_NEKUDOTAYIMerror,指的是第三行的解析操作符。

问题:

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

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

附加信息:

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

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

2 回答 2

1

Actually, you don't have to upgrade to reference the class dynamically. Yii does it without and yii supports PHP 5.2. If you are interested, I can see if I can dig up how it is done, but I've run into the same problem and resolved it on PHP 5.2

Edit: Ok, here's the info. I posted the original info on a Yii wiki page.

Here's the code that returns a Yii singleton model:

    $thisModel = call_user_func($modelname, 'model');

But, per DCoder, it looks like CActiveRecord::model($modelname) will also work:

Yii info here: http://www.yiiframework.com/doc/api/1.1/CActiveRecord#model-detail

于 2013-03-08T19:10:51.040 回答
1

我在这里找到了答案:

http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php

范围解析运算符(也称为 Paamayim Nekudotayim)或更简单的术语是双冒号,是一个允许访问类的静态、常量和重写属性或方法的标记。

从类定义之外引用这些项目时,请使用类的名称。

从 PHP 5.3.0 开始,可以使用变量来引用类。变量的值不能是关键字(例如 self、parent 和 static)。

基本上,我必须升级 PHP 版本才能动态引用一个类。

于 2013-03-08T10:27:35.063 回答