2010-07-29 5 views
1

Учитывая следующий PHP класс:Как узнать, когда Fatal Fatal Error действительно является завуалированной Синтаксической ошибкой, и когда они происходят?

class someObject { 
    public function broken(){ 
     return isset($this->something()) ? 'worked' : 'didnt'; 
    } 

    public function something(){ 
     return true; 
    } 

    public function notBroken(){ 
     print('worked'); 
    } 
} 

Допустим, я сейчас:

$obj= new someObject(); 
$obj->broken(); 

Учитывая вы не можете передать вызов функции Исети(), (это побочное ссылка), я ожидаю, что это сбой с фатальной ошибкой: PHP Fatal error: Can't use method return value in write context Это нормально и ожидается.

Однако, скажем, я сейчас:

$obj= new someObject(); 
$obj->notBroken(); 

Учитывая, что я не ударять broken() где-нибудь в этом исполнении, а ошибка в broken() является Fatal Error (а не ошибка Анализировать) , Я бы не ожидал, что нормальный выход «сработает». FALSE! Он по-прежнему генерирует Fatal Error.

Вопрос:

Помимо просто не писать код, который имеет ошибки, есть какие-либо другие ошибки, которые не Parse ошибки, но по-прежнему вызывают ошибки во время выполнения? Я знаю только о: PHP Fatal error: Can't use method return value in write context. Есть ли способ обнаружить эти ошибки? Есть ли специальное имя для такого типа ошибок?

+0

ну, это не ошибка синтаксического анализа, это вполне допустимый синтаксис. Вот почему это приводит к фатальной ошибке, поскольку она не восстанавливается. Также вы можете использовать php -l для проверки таких ошибок в коде. Синтаксический анализатор все равно выдаст ошибку, и, таким образом, не будет выполняться «Ошибки разбора broken_parser.php», –

ответ

1

Причина этого конкретного поведения, вероятно, заключается в том, что isset() - это языковая конструкция, а не нормальная функция, которая интерпретируется во время выполнения. Таким образом, это означает, что это вид ошибка синтаксического анализа.

У меня нет глубокого понимания этого, и я не знаю, имеет ли этот класс ошибок определенное имя.

0

Это «ошибки компиляции», выброшенные компилятором, когда он встречает синтаксически действительную, но «не скомпилированную» конструкцию. Перейдите на страницу http://svn.php.net/viewvc/php/php-src/trunk/Zend/zend_compile.c и найдите «E_COMPILE_ERROR» - их немало.