调用未定义的方法stdClass

时间:2015-03-27 12:58:51

标签: php

我偶尔会遇到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的人会发生这种情况。

提前致谢, 吉姆

2 个答案:

答案 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()正在调用查询,则可能仅在某些时间发生,具体取决于该查询的结果。