Pourquoi la mise entre parenthèses d'un appel de fonction en PHP évite-t-elle une erreur de référence ?

Susan Sarandon
Libérer: 2024-10-26 22:35:30
original
265 Les gens l'ont consulté

Why Does Parenthesizing a Function Call in PHP Avoid a Reference Error?

Parenthèses et sémantique des appels de fonction en PHP

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>
Copier après la connexion

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 :

  1. L'argument n'est pas un appel de fonction.
  2. L'argument est soit une référence, soit a un nombre de références de 1.

Dans l'exemple fourni, la fonction entre parenthèses call ((get_array())) satisfait aux deux conditions :

  1. Il n'est pas reconnu comme un appel de fonction en raison des parenthèses supplémentaires.
  2. Le tableau renvoyé a un nombre de références de 1 puisqu'il n'est référencé que dans l'appel de fonction.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal