Lorsque j'exécute les étapes de "Behat", la fonction Gestionnaire d'erreurs Behat transforme les erreurs "Trying to get property of non-object" en exceptions.
Cela est très utile, car l'étape est marquée comme ayant échoué, ce qui permet au test de se poursuivre avec le scénario suivant.
Cependant, les erreurs "Call to a member function on a non-object" sont fatales et interrompent immédiatement l'exécution du test (y compris l'interruption de l'écriture des résultats au format xml). Ce n'est pas utile.
Mes questions sont les suivantes :
-
Quelle est la différence entre ces deux erreurs ? S'agit-il de "niveaux d'erreur" différents ? Où cela est-il documenté ? J'ai cherché sur le site de PHP et sur Google, et je n'ai pas trouvé la référence canonique, juste beaucoup de questions sur le débogage des instances spécifiques de chaque erreur.
-
Existe-t-il un moyen de convertir cette dernière erreur en exception, au lieu d'arrêter complètement le script ? Il ne me semble pas que le déréférencement de "
null
" avec "->
"est une erreur qui "ne peut pas être récupérée, comme un problème d'allocation de mémoire".
Mise à jour :
Il semble qu'il s'agisse d'un problème connu avec PHP. Voir :
- #51882 L'appel d'une fonction membre à un non-objet doit déclencher une exception
- #46601 E_RECOVERABLE_ERROR pour "Call to a member function on a non-object" (Appel à une fonction membre sur un non-objet)
- #51848 Les erreurs d'appel de méthode non liées à un objet doivent pouvoir être rattrapées avec set_error_handler()
- #63538 "L'appel à une fonction non définie devrait être rattrapable.
Certains disent que c'est "par conception", mais je pense que c'est juste un artefact des niveaux d'erreur qui ont été définis avant que les objets ne soient ajoutés à PHP. Dans un langage non-OO, appeler une fonction inexistante est une erreur sérieuse, et je peux voir comment elle pourrait être décrite comme "fatale" ou "non récupérable" (bien que, dans un langage non-OO où les fonctions peuvent être définies à la volée, même cela semble exagérément pessimiste). De nos jours, maintenant qu'il est possible de faire " $a->f()
"sur n'importe quel vieux $a
il est beaucoup plus probable que " f
"peut ne pas exister, et il semble que cela ne devrait pas être une erreur fatale (cf. Java où cela serait une NullPointerException).
Je suppose que cela m'amène à une nouvelle question :
_ 3. Comment pourriez-vous patcher PHP pour rendre les erreurs "Call to a member function on a non-object" non fatales, sans casser massivement la compatibilité ascendante, et quelles mesures pourriez-vous prendre pour maximiser la probabilité que ce patch soit accepté dans PHP ?
Mise à jour 2 re Parcheando PHP :
Il existe un soutien limité sur la liste de diffusion PHP internals pour avoir effectué cette correction. Il ne me reste plus qu'à écrire un patch pour corriger cela et créer un RFC.