Maison >développement back-end >tutoriel php >Pourquoi les parenthèses corrigent-elles les erreurs « Seules les variables doivent être transmises par référence » dans les appels de fonction PHP ?

Pourquoi les parenthèses corrigent-elles les erreurs « Seules les variables doivent être transmises par référence » dans les appels de fonction PHP ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 20:54:02269parcourir

Why do Parentheses Fix

Parenthèses et signification des résultats des appels de fonction

Considérez l'exemple suivant :

<?php
function get_array() {
    return array();
}

function foo() {
    return reset(get_array()); // Error: "Only variables should be passed by reference"
}

Dans ce code, l'erreur se produit car le résultat de l'appel de fonction n'est pas une référence. Cependant, si le résultat est mis entre parenthèses, l'erreur disparaît :

function foo() {
    return reset((get_array())); // OK
}

Que se passe-t-il ici ?

Malgré l'absence de documentation décrivant explicitement ce comportement, il peut être compris en examinant la grammaire PHP et l'implémentation du compilateur.

Effet sur l'analyse

Les parenthèses amènent l'analyseur PHP à interpréter le résultat de l'appel de fonction comme une expression au lieu d'une variable. Cela affecte la façon dont le compilateur interprète le code, en particulier l'opcode utilisé pour envoyer des variables aux fonctions.

Nombre de références et optimisation du moteur Zend

Le moteur Zend, le moteur principal de PHP , permet d'utiliser des variables non références avec un nombre de références de 1 là où des références sont attendues. Dans l'exemple ci-dessus, le tableau renvoyé est un nouvel objet avec un nombre de références de 1. Cela permet au Zend Engine d'optimiser le code et d'éviter le message d'erreur.

Limitations

Il est important de noter que ce comportement est considéré comme un bug et ne doit pas être invoqué. Le nombre de références du résultat de l'appel de fonction peut changer dans les futures versions de PHP, cassant le code qui dépend de ce comportement.

Solution alternative

Pour éviter de s'appuyer sur cette solution potentiellement instable comportement, assignez explicitement le résultat de l'appel de fonction à une variable :

function foo() {
    $result = get_array();
    return reset($result);
}

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!

Déclaration:
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