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
Libérer: 2024-10-26 20:54:02
original
150 Les gens l'ont consulté

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

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

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

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!