我偶尔会遇到PHP致命错误:在第25行的agent.php中调用未定义的方法stdClass :: transition()(我在代码中标记了第25行)。这段代码经常被调用,因此很难理解它为什么会发生。
以下是调用
的agent.php的片段 function agent_exam_complete($exam){
$ce = $exam->educational();
$ce->exam_id = $exam->exam_id;
$ce->exam_grade = $exam->score;
$ce->exams_remaining -= 1;
$ce->exam_received_date = sql_now();
if($exam->status()=='passed'){
$ce->transition('passed');
}elseif($ce->exams_remaining <= 0){
$ce->transition('failed');
}
$ce->save();
if($ce->is_certification_completed($ce->certification_id, $ce->client_no)){
agent_certification_complete($ce->certification_id, $ce->client_no);
}
}
function agent_certification_complete($certification_id, $client_no){
$ce = ClientPurchase::find('first', array('conditions' => "certification_id = '$certification_id' and is_certification = 1 and client_no='$client_no'"));
$ce->certification_date = date('Y-m-d');
$ce->transition('passed'); **//Line 25**
$ce->save();
}
transition()在另一个文件中定义,并经常调用。我已经包含了一些代码,仅仅是为了调味。
function transition($event_tag){
$old_status = $this->status;
$next_status = $this->next_status_for_transition($event_tag);
if($next_status==''){
return; }
$this->status = $next_status;
我的问题是,为什么我只是定期而不是一直得到这个错误?我该怎么做才能消除我的客户的错误和随后的空白屏幕?我只是注意到那些使用Firefox或Chrome的人会发生这种情况。
提前致谢, 吉姆
答案 0 :(得分:0)
包含该函数的对象$ce
正在多次生成。我想这是transition
为任何被调用的对象定制的。
为什么不为可重复使用的功能创建另一个对象?考虑扩展该功能,使其与所有使用它的对象兼容。
$my = new functionClass;
class functionClass
{
function transition()
{
$old_status = $this->status;
$next_status = $this->next_status_for_transition($event_tag);
if($next_status==''){
return; }
$this->status = $next_status;
}
}
$my->transition( 'passed' );
这样的事情会减少不可预测性,我相信可以解决你的问题。
答案 1 :(得分:0)
试试这段代码,了解最新情况:
$ce = false;
$ce->certification_date = date('Y-m-d');
var_dump($ce);
在这种情况下,当您尝试设置属性(certification_date)时,$ ce会被强制转换为stdClass的对象。
现在你的代码:
function agent_certification_complete($certification_id, $client_no){
$ce = ClientPurchase::find('first', array('conditions' => "certification_id = '$certification_id' and is_certification = 1 and client_no='$client_no'"));
//$ce is probably false or null
//it gets cast to a stdClass object
$ce->certification_date = date('Y-m-d');
//stdClass does not have a transition method; ERROR
$ce->transition('passed'); **//Line 25**
$ce->save();
}
因此,在您的代码中,如果find()
返回null或false,或者某些其他选择值,$ce
将被转换为下一行的stdClass对象。然后该stdClass对象没有transition()
方法,因此您会收到错误。
要解决此问题,请调整find方法或检查其返回值并相应地处理。
至于它只在某些浏览器中发生,我认为这是一个错误的结论。如果find()
正在调用查询,则可能仅在某些时间发生,具体取决于该查询的结果。