En PHP, mettre le résultat d'un appel de fonction entre parenthèses peut modifier la sémantique du résultat, comme le démontre ce qui suit code :
<code class="php">function get_array() { return array(); } function foo() { // return reset(get_array()); // ^ error: "Only variables should be passed by reference" return reset((get_array())); // ^ OK } foo();</code>
Ce comportement déroutant n'a pas d'explication explicite dans la documentation officielle, laissant les développeurs incertains quant à ses mécanismes sous-jacents.
Analyse
La clé pour comprendre ce comportement réside dans l'ambiguïté du langage PHP dans l'analyse des arguments des appels de fonction. Lorsque des parenthèses sont ajoutées autour de l'appel de fonction comme dans (get_array()), PHP ne le traite pas comme un appel de fonction, mais comme une expression. Cette distinction est cruciale car l'opcode utilisé pour envoyer des variables (ZEND_SEND_VAR_NO_REF) a un comportement différent pour les appels de fonction par rapport aux expressions.
Lorsqu'il rencontre une expression d'appel non fonctionnelle, ZEND_SEND_VAR_NO_REF effectue les vérifications suivantes :
Dans l'exemple fourni, la fonction entre parenthèses call ((get_array())) satisfait aux deux conditions :
En conséquence, l'opcode se poursuit sans générer l'erreur "Seules les variables doivent être transmises par référence". Cependant, il est important de noter que ce comportement est considéré comme un bug et ne doit pas être pris en compte dans le code de production.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!