2015-03-27 3 views
1

Я иногда получаю PHP Неустранимая ошибка: вызов неопределенного метода stdClass :: transition() в agent.php в строке 25 (я выделил строку 25 в коде). Этот код часто называется, поэтому он пытается понять, почему это происходит.Звонок на неопределенный метод stdClass

Вот фрагмент 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(); 
} 

() определен в другом файле и называется часто. Я включил немного своего кода только для аромата.

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

Странно. Поскольку PHP является серверной, он не должен влиять на конкретный браузер. –

+0

Согласен. Не знал, были ли в браузере разные тайм-ауты, которые могут вызвать проблему. Схватывание на соломинках. – Jim

+0

Любой тайм-аут для PHP также будет установлен на стороне сервера либо в конфигурации PHP, либо в Apache. Вы получаете ошибки в журналах? –

ответ

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'); 

Что-то вроде этого сократит непредсказуемость, и я верю, что это может решить вашу проблему.

0

Попробуйте этот небольшой фрагмент кода, чтобы увидеть, что происходит:

$ce = false; 
$ce->certification_date = date('Y-m-d'); 
var_dump($ce); 

В этом случае $ се получить приведение к объекту StdClass при попытке установить свойство (certification_date).

Теперь код:

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() возвращается нуль или ложь, или, возможно, некоторые другие значения выбора, $ce получает приведение к объекту StdClass на следующей строке. Тогда этот объект stdClass не имеет метода transition(), поэтому вы получите сообщение об ошибке. Чтобы исправить это, отрегулируйте свой метод поиска или проверьте его возвращаемое значение и соответствующим образом обработайте.

Что касается этого события только в определенном браузере, я думаю, что это ложный вывод. Если find() вызывает запрос, это, вероятно, происходит только в определенное время в зависимости от результата этого запроса.

Смежные вопросы