Explication détaillée de la définition de référence php et de l'utilisation de l'instance de paramètre de transmission de référence

伊谢尔伦
Libérer: 2023-03-14 10:14:01
original
2895 Les gens l'ont consulté

Passer par référence

Vous pouvez passer une variable à une fonction par référence afin que la fonction puisse modifier la valeur de son paramètre. La syntaxe est la suivante :

<?php
function foo(&$var)
{
    $var++;
}
$a=5;
foo($a);
// $a is 6 here
?>
Copier après la connexion

Notez qu'il n'y a pas de symboles de référence dans l'appel de fonction - uniquement dans la définition de la fonction. La définition de la fonction à elle seule suffit pour que les paramètres soient passés correctement par référence. Dans les versions récentes de PHP, si vous utilisez & in foo(&$a); vous recevrez un avertissement indiquant que "Call-time pass-by-reference" est obsolète.

Les éléments suivants peuvent être transmis par référence :

Variables, telles que foo($a)
Nouvelles instructions, telles que foo(new foobar())
Références renvoyées par fonctions , par exemple :

<?php
function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());
?>
Copier après la connexion

Pour une explication détaillée, voir le retour de référence.
Toute autre expression ne peut pas être transmise par référence et le résultat n'est pas défini. Par exemple, l'exemple suivant de passage par référence n'est pas valide :

<?php
function bar() // Note the missing &
{
    $a = 5;
    return $a;
}
foo(bar()); // 自 PHP 5.0.5 起导致致命错误
foo($a = 5) // 表达式,不是变量
foo(5) // 导致致命错误
?>
Copier après la connexion

Ces conditions sont disponibles dans PHP 4.0.4 et versions ultérieures.

Retour de référence
Le retour de référence est utilisé lorsque vous souhaitez utiliser une fonction pour trouver à quelle variable la référence doit être liée. N'utilisez pas de références de retour pour augmenter les performances, le moteur est suffisamment intelligent pour l'optimiser lui-même. Ne renvoyez les références que s’il existe une raison technique valable ! Pour renvoyer une référence, utilisez cette syntaxe :

<?php
class foo {
    public $value = 42;
    public function &getValue() {
        return $this->value;
    }
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue;                // prints the new value of $obj->value, i.e. 2.
?>
Copier après la connexion

Dans cet exemple, les propriétés de l'objet renvoyées par la fonction getValue se verront attribuer des valeurs, non copiées, comme si la syntaxe de référence n'était pas utilisée.

Remarque : contrairement au passage de paramètres, l'esperluette doit être utilisée aux deux endroits ici - indiquant qu'une référence est renvoyée, et non la copie habituelle, et indiquant également que $myValue est lié comme référence, au lieu de l'habituel. affectation.

Remarque : Si vous essayez de renvoyer une référence à partir d'une fonction comme celle-ci : return ($this->value);, cela ne fonctionnera pas car vous essayez de renvoyer le résultat d'une expression plutôt qu'un variable référencée. Vous ne pouvez renvoyer que des variables de référence à partir de fonctions - il n'y a pas d'autre moyen. Si le code tente de renvoyer le résultat d'une expression dynamique ou de l'opérateur new, une erreur E_NOTICE est émise à partir de PHP 4.4.0 et PHP 5.1.0.

<?php
function &test(){ 
    static $b=0;//申明一个静态变量 
    $b=$b+1; 
    echo $b; 
    return $b; 
}
$a=test();//这条语句会输出$b的值为1 
$a=5; $a=test();//这条语句会输出$b的值为2
$a=&test();//这条语句会输出$b的值为3 
$a=5; $a=test();//这条语句会输出$b的值为6
?>
Copier après la connexion

L'appel d'une fonction à l'aide de $a=test() attribue uniquement la valeur de la fonction à $a, et toute modification apportée à $a n'affectera pas $b dans la fonction. $a=&test(), sa fonction est de pointer l'adresse mémoire de la variable $b en retour $b et l'adresse mémoire de la variable $a au même endroit, ce qui produit l'équivalent de cet effet ( $a=&b ;) Ainsi, changer la valeur de $a change également la valeur de $b, donc après avoir exécuté $a=&test(); $a=5;, la valeur de $b devient 5.

Paramètres de transmission PHP par utilisation de référence

<?php
function add_some_extra(&$string) // 引入变量,使用同一个存储地址
{
  $string .= &#39;and something extra.&#39;;
}
$str = &#39;This is a string, &#39;;
add_some_extra($str);
echo $str;  // outputs &#39;This is a string, and something extra.&#39;
?>
Copier après la connexion

Sortie :

This is a string, and something extra.
Copier après la connexion

Sans l'esperluette

<?php
function add_some_extra($string)
{
  $string .= &#39;and something extra.&#39;;
}
$str = &#39;This is a string, &#39;;
add_some_extra($str);
echo $str;  // outputs &#39;This is a string, &#39;
?>
Copier après la connexion

Sortie :

This is a string,
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!

Étiquettes associées:
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal