ATK4:错误:不在对象上下文中时使用$ this

时间:2013-12-17 16:46:13

标签: atk4

我在ATK4中定义了一个带有表达式字段的方法:

$this->addExpression('answered')->set(function($model,$select){
    return $select->dsql()
          ->table('answer')
          ->field($select->expr('if(count(*)>0,"Y","") as answered'))
          ->where('usecollection_id',$select->getField('id'))
          ->where('student_id',$this->api->auth->get('id'));

  })->type('boolean')->caption('Besvaret');

它在我的开发机器上工作正常,但在生产服务器上它会抛出一个致命错误:PHP致命错误:当不在file.php中的对象上下文中时使用$ this

这是有问题的一行:

$this->api->auth->get('id')

知道导致这种差异的原因以及如何使其发挥作用?

2 个答案:

答案 0 :(得分:3)

一种方法是将$ this传递给封闭的函数,如下所示:

$self = $this;
$this->addExpression('answered')->set(function($model,$select)use($self){
    echo $self->api->auth->get('id');
});

这就是你应该如何经常将变量传递给PHP中的匿名函数。

在这种特殊情况下,另一种可能性是简单地使用$select->api->...$model->api->...或任何其他ATK4对象而不是this->api->...。这是因为所有ATK4对象都引用了API类,因此$whateverObject->api->...将始终有效并始终指向相同的API类对象。

答案 1 :(得分:0)

您正在引用一个未在函数中传递或声明的变量($ this)(您将$ model和$ select传递给函数)。

我不够聪明地告诉你解决这个问题的最佳方法,也许你可以在之前定义$ auth_id(将其设置为$ this-> api-> auth-> get('id'))该函数被调用并将该变量传递给它?

虽然有必要有更好的方法......