2010-07-29 5 views
1

Compte tenu de la classe PHP suivante:Comment savoir quand une erreur fatale PHP est vraiment une erreur de syntaxe voilée, et quand cela arrive-t-il?

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

    public function something(){ 
     return true; 
    } 

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

Disons que je fais maintenant:

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

Considérant que vous ne pouvez pas passer un appel de fonction à isset(), (il est sous- référence), je m'attends à ce que cela échoue avec une erreur fatale: PHP Fatal error: Can't use method return value in write context C'est très bien, et attendu.

Cependant, disons que je fais maintenant:

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

vu que je ne suis pas frapper le broken() partout dans cette exécution, et l'erreur dans broken() est une erreur fatale (et non une erreur Parse) , Je ne m'attendrais pas à la sortie normale de "travaillé". FAUX! Il génère toujours l'erreur fatale.

Question:

Mis à part le code tout simplement pas écrit comporte des erreurs, y at-il d'autres erreurs qui ne sont pas des erreurs d'analyse mais déclenchent une erreur d'exécution? Je connais seulement: PHP Fatal error: Can't use method return value in write context. Est-il possible de détecter ces erreurs? Y a-t-il un nom spécial pour ce type d'erreur?

+0

bien ce n'est pas une erreur d'analyse, c'est une syntaxe parfaitement valide. C'est aussi pourquoi il donne une erreur fatale, puisqu'il n'est pas récupérable. Vous pouvez également utiliser php -l pour vérifier ce type d'erreur dans le code. L'analyseur donnera toujours une erreur, et donc pas d'exécution "Erreurs d'analyse broken_parser.php" –

Répondre

1

La raison de ce comportement spécifique est probablement que isset() est une construction de langage et non une fonction normale qui est interprétée lors de l'exécution. Donc, il va de soi que c'est sorte de une erreur d'analyse.

Je n'ai pas de connaissance approfondie à ce sujet, et je ne sais pas si cette classe d'erreurs a un nom spécifique.

Questions connexes