我在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')
知道导致这种差异的原因以及如何使其发挥作用?
答案 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'))该函数被调用并将该变量传递给它?
虽然有必要有更好的方法......