Как определить, является ли PHP Fatal Error действительно скрытой синтаксической ошибкой, и когда она возникает? - PullRequest
1 голос
/ 29 июля 2010

Учитывая следующий класс PHP:

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

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

Однако, скажем, яТеперь сделайте:

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

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

Вопрос:

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

Ответы [ 2 ]

1 голос
/ 09 августа 2010

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

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

0 голосов
/ 19 августа 2011

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

...