Maison  >  Article  >  La véritable compréhension des références et en PHP - références de variables, références de fonctions, références d'objets

La véritable compréhension des références et en PHP - références de variables, références de fonctions, références d'objets

无忌哥哥
无忌哥哥original
2018-06-27 15:49:471826parcourir

Référence de variable
La référence PHP vous permet d'utiliser deux variables pour pointer vers le même contenu

<?php
$a="ABC"; 
$b =&$a; 
echo $a;//这里输出:ABC 
echo $b;//这里输出:ABC 
$b="EFG"; 
echo $a;//这里$a的值变为EFG 所以输出EFG 
echo $b;//这里输出EFG 
?>

Je n'ai pas beaucoup d'appels de passage par référence pour Cela dit, le code est donné directement ci-dessous

<?php
function test(&$a){ 
    $a=$a+100; 
} 
$b=1; 
echo $b;//输出1 
test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了 
echo "<br>"; 
echo $b;//输出101
?>

Il est à noter que si test(1); la référence ne peut pas être une constante (vous pouvez voir le message d'erreur) .

Retour de référence de fonction Regardez d'abord le code

<?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
?>

L'explication suivante : De cette façon, $a=test(); Il n'y a aucune différence dans les appels de fonction. Quant à la raison : c'est la réglementation PHP qui stipule que ce qui est obtenu via $a=&test(); le manuel PHP dit : Le retour de référence est utilisé lorsque vous souhaitez utiliser Lorsque la fonction trouve à quelle variable la référence doit être liée ) Cette absurdité m'a rendu incapable de le comprendre pendant longtemps

Utilisez l'exemple ci-dessus. pour expliquer que la fonction est appelée en utilisant $a=test(), qui vient d'attribuer la valeur de la fonction à $a, et toute modification apportée à $a n'affectera pas $b dans la fonction lors de l'appel de la fonction via $. a=&test(), sa fonction est de renvoyer la valeur dans $b. L'adresse mémoire de la variable $b et l'adresse mémoire de la variable $a pointent au même endroit, ce qui produit le même effet ($a=&b; ). Ainsi, changer la valeur de $a change également la valeur de $b, donc lors de l'exécution de After $a=&test(); $a=5;, la valeur de $b devient 5

C'est à dire. laissez tout le monde comprendre le retour de référence de la fonction avant d'utiliser des variables statiques. En fait, le retour de référence de la fonction a de nombreuses utilisations Dans l'objet

la référence de l'objet

<?php
class a
{ 
   var $abc="ABC";
}
$b=new a; $c=$b; echo $b->abc;//这里输出ABC 
echo $c->abc;//这里输出ABC 
$b->abc="DEF"; 
echo $c->abc;//这里输出DEF
?>

Le Le code ci-dessus est l'effet exécuté en PHP5. En PHP5, la copie des objets est réalisée par référence. Dans la colonne ci-dessus, $b=new a; $c=$b; est en fait équivalent à $b=new a; La valeur par défaut en PHP5 est d'appeler l'objet par référence, mais parfois vous pouvez le faire. vouloir créer un objet Une copie de l'objet original et espérer que les modifications apportées à l'objet original n'affecteront pas la copie. À cet effet, PHP définit une méthode spéciale appelée __clone.

Le rôle de référence
. Si le programme est relativement volumineux, s'il existe de nombreuses variables qui font référence au même objet et que vous souhaitez l'effacer manuellement après avoir utilisé l'objet, je recommande personnellement d'utiliser la méthode "&", puis d'utiliser $var=null pour effacer Dans d'autres cas, utilisez la méthode par défaut de php5. De plus, pour le transfert de grands tableaux en php5, il est recommandé d'utiliser la méthode "&", après tout, cela économise de l'espace mémoire.

Unreference Lorsque vous supprimez une référence, vous rompez simplement la liaison entre le nom de la variable et le contenu de la variable. Cela ne signifie pas que le contenu des variables est détruit. Par exemple :

115c9d6bf06c9f77722327e460010e96

ne supprimera pas $b, juste $a. function quoteTest(){ global $var; //Équivalent à $var = &$GLOBALS['var']; unset($var); //La suppression supprime uniquement la référence, mais le contenu référencé existe toujours. Cela ne veut pas dire que le contenu de la variable est détruit}$var=1;quoteTest();echo $var; // Résultat 1

----------------- --------- ----------------------------------------- --------- -------------------------

ne supprimera pas $b, juste $a .

function quoteTest(){ global $var ; //Équivalent à $var = &$GLOBALS['var']; //Parce qu'ils pointent tous les deux vers le même contenu mémoire}$var =1 ;quoteTest();echo $var; //Résultat 5---------------------------------- ---------- --------------------------------------------- ---------- -------

'&' Ceci est une référence

référence globale Lors de la déclaration d'une variable avec global $var, une référence à la variable globale est effectivement établie. Cela revient à faire :

16d5bca28eea70134faf7d1a6e335023

Cela signifie, par exemple, que les variables globales $var non définies seront ne soit pas désarmé.

$this Dans une méthode d'un objet, $this est toujours une référence à l'objet qui l'appelle.

//Voici un autre petit épisode. La fonction de pointage (similaire au pointeur) de l'adresse en PHP n'est pas implémentée par l'utilisateur lui-même, mais est implémentée par le noyau Zend. La référence en PHP utilise le "copy-". on-write" Le principe est qu'à moins qu'une opération d'écriture ne se produise, les variables ou objets pointant vers la même adresse ne seront pas copiés.

En termes simples 1 : S'il existe le code suivant [php] $a="ABC" ; $b=$a [/php] En fait, $a et $b pointent tous les deux vers le même; adresse mémoire à ce moment Ce n'est pas que $a et $b occupent des mémoires différentes

2 : Si vous ajoutez le code suivant au code ci-dessus [php] $a="EFG" [/php] Puisque $a et Les données dans la mémoire pointées par $b doivent être réécrites. À ce stade, le noyau Zend déterminera et produira automatiquement une copie des données de $a pour $b, et réappliquera un morceau de mémoire. pour le rangement

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