Explication détaillée de la référence des variables PHP et du mécanisme de destruction des variables

墨辰丷
Libérer: 2023-03-28 12:06:02
original
1277 Les gens l'ont consulté

Les variables sont un type très important en php. Toutes nos données sont exploitées via des variables ou des constantes. Jetons un coup d'œil à la référence et à la destruction de variables. Les amis qui en ont besoin peuvent s'y référer

. Référence de variable php et mécanisme de destruction de variable

En php, le symbole "&" représente une référence.

1. Regardez la situation sans citer :

$a = “hello world”;//定义一个变量,下面赋值给$b
$b = $a;//这一步没有在$a之前加符号&,像这样子”$b= & $a”。没有加&,实际上原理是会将变量$a复制拷贝一份,也就是内存中重新申请一个地址存储变量$b了
Copier après la connexion

ps : en php , utilisez "= " pour attribuer directement une valeur. En fait, il copie la variable de droite vers b, ce qui va générer un espace mémoire. Le résultat peut être que le même contenu soit en deux exemplaires dans la mémoire. Comme mentionné dans certains aspects des performances de PHP, cela occupera plus d'espace mémoire. Cependant, dans mes contacts, la plupart des gens n'y ont pas prêté beaucoup d'attention. En fait, la différence significative provoquée par une telle application générale n'est pas évidente. Vous ne verrez aucun effet. En fait, je n'utilise pas souvent & pour les citations, haha. C’est juste que je pense qu’il est très nécessaire d’avoir une compréhension approfondie des principes de mise en œuvre. J'aime me concentrer sur les choses fondamentales.

2. Utilisez le symbole & pour la citation

$a = “hello world”;
$b = & $a;
Copier après la connexion

Utilisez la citation, le moteur php ne fera pas une copie La variable pointe en fait le pointeur vers l'adresse de $a en mémoire, et $b stocke ce pointeur.
Ainsi, lorsque vous utilisez une référence, si vous modifiez la valeur de $b, $a changera également en conséquence

Par exemple :

$a = “hello world”;
$b = & $a;
$b = “test new value”;//把b的值改掉,a的值也会跟着改变
echo $a;//输出test new value,因为改变了b的值也会改变a的值。
=====================================
经常在定义函数的时候看到像这样的情况:
function test (& $param)
{
//函数定义的内容
$param++;
}
Copier après la connexion

Explication : Il y a une référence devant $param, donc les paramètres passés ne seront pas copiés dans la mémoire, mais feront directement référence à l'espace mémoire d'origine. Donc : si la valeur de la variable transmise à l'aide du symbole & est modifiée, la valeur dans l'espace mémoire d'origine sera également modifiée.

Faites un test comme suit :

$k = 8;
test($k);
echo $k;//结果$k的值被函数里面改变了,输出9。
还会经常看到这样子调用函数:
$return = & test_func();
Copier après la connexion

J'ai appris plus tôt que le mécanisme du moteur php est : = copiera le contenu à droite Donnez la variable à gauche. Donc utiliser & signifie copier le résultat de la fonction. En fait, je crois comprendre que le pointeur est donné sur la variable de gauche.

Qu'est-ce qu'un pointeur ? J'ai appris le concept en langage C. Ma compréhension est la suivante : pointeur, pointeur, aiguille pointée (boussole, haha). C'est plus facile à comprendre si vous considérez un pointeur comme une adresse mémoire. L'ordinateur saura où trouver les données dans la mémoire. C'est une compréhension superficielle, je ne sais pas comment la comprendre en profondeur, haha.

Résumé : Utiliser des références consiste à réduire l'utilisation des ressources mémoire.

Le manuel PHP explique la référence comme suit :

La référence en PHP signifie accéder au même contenu de variable avec des noms différents. Ce n'est pas comme un pointeur C, la référence est un alias de table de symboles. Notez qu'en PHP, les noms de variables et le contenu des variables sont différents, donc le même contenu peut avoir des noms différents. L'analogie la plus proche concerne les noms de fichiers Unix et les fichiers eux-mêmes : les noms de variables sont les entrées du répertoire et le contenu des variables est les fichiers eux-mêmes. Les références peuvent être considérées comme des liens physiques dans les systèmes de fichiers Unix.

3. Lors de la destruction de variables. Cela ne changera pas la valeur d'origine.

Test : $b = & $a;

Puisque la valeur de $b est modifiée, la valeur de $a change également si $b est détruit (. mémoire Il ne prend plus de place, il n'est pas nul et il n'a pas de valeur "") La valeur de $a sera-t-elle également supprimée ?

En fait, il existe un livre étranger sur PHP qui mentionne spécifiquement ce mécanisme. Je l'ai vu il y a 2 ans. Je ne m'en souviens pas très bien. Le principe est que lorsqu'une variable est supprimée, elle sera automatiquement copiée.
En fait, c'est pour éviter de supprimer $b et de provoquer le problème de la suppression de $a.

<?php
$a = &#39;d&#39;;
$b = & $a;
$b = 8;//因为是引用了,所以把b的值改掉,a的值也跟着改为8了。
var_dump($b,$a);
unset($b);//调用unset删除b变量,a变量不会删除
var_dump($b,$a);//输出null和8
?>
Copier après la connexion

Lors de l'appel d'unset pour supprimer la variable $b, le moteur php a découvert dans la table des symboles des variables : la variable $b que je voulais supprimer était référencée à l'origine La variable $a n'est pas facile à supprimer, car une fois supprimée, la variable $a a disparu, nous faisons donc d'abord une copie de la variable $a puis supprimons la variable $b.

Concernant la table des symboles PHP : En fait, d'après ce que je comprends, tous les noms de variables en cours de fonctionnement y sont enregistrés et conservés par PHP. Les données spécifiques sont bien sûr stockées en mémoire. PHP utilise cette table de symboles pour. recyclez-le. Espace variable utilisé, libérez de l'espace mémoire). Allez jeter un oeil au mécanisme de garbage collection de PHP (libérer de l'espace mémoire qui n'est plus utilisé), qui est basé sur la table des symboles.

Exemples

<?php
$long="big_long_variable_name";
$$long="PHP";   /* 用存放在变量$long里的字符串作为新变量的变量名,等同于$big_long_variable_name="PHP"; */
$short=& $big_long_variable_name; /* 取变量$big_long_variable_name的值赋给变量$short,此时$short的值为"PHP",等同于$short=& $$long; */
print "01 /$short is $short.";  /* "/$"是转义序列,表示输出一个美元符号$,下同。本语句的作用是输出:01 $short is PHP. */
print "02 Long is $big_long_variable_name."; /* 输出:02 Long is PHP. */
?>
<br />
<br />
<?php $big_long_variable_name.=" rocks!"; /* 重新对$big_long_variable_name赋值。重新赋值过程中,由于在$big_long_variable_name的后面添加了.(点号),因而变量$big_long_variable_name此时的值应为原值("PHP")+新值(" rocks!"),即变量$big_long_variable_name当前完整的值为"PHP rocks!"。下同。*/
print "03 /$short is $short";  /* 输出:03 $short is PHP rocks! */
print "04 Long is $big_long_variable_name"; /* 输出:04 Long is PHP rocks! */
?>
<br />
<br />
05 $short is PHP rocks!
06 Long is PHP rocks!
<br />
<br />
<?php $short.="Programming $short";  /* 重新对变量$short赋值。由于在$short后面添加了.(点号),因此请参考上例分析$short的值。*/
print "07 /$short is $short";  /* 输出:07 $short is PHP rocks!Programming PHP rocks! */
print "08 Long is $big_long_variable_name"; /* 由于变量$short被重新赋值为Programming PHP rocks!,因而变量$big_long_variable_name的值也与$short一同被改变为"PHP rocks!Programming PHP rocks!"。本语句输出:08 Long is PHP rocks!Programming PHP rocks!注意,如果是对具有相同值的一个变量进行销毁unset( ),则另一个变量不适用于此种情况,即不会随之被一同销毁。*/
?>
<br />
<br />
09 $short is Programming PHP rocks!
10 Long is Programming PHP rocks!
<br />
<br />
<?php $big_long_variable_name.="Web Programming $short"; /* 变量$big_long_variable_name被重新赋值,此时它完整的值应为PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks!。变量$short的值此时与变量$big_long_variable_name一致。请分别参考第5处、第10处注释进行分析。*/
print "11 /$short is $short";   /* 输出:11 PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "12 Long is $big_long_variable_name";
?>
<br />
<br />
<?php
unset($big_long_variable_name);  /* 用unset( )销毁变量$big_long_variable_name,变量$short不会因此受到任何影响。*/
print "13 /$short is $short";  /* 虽然销毁了变量$big_long_variable_name,但$short没有受到影响,它的值仍是最近一次被赋予的PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "14 Long is $big_long_variable_name."; /* 变量$big_long_variable_name已被销毁,故而无值。输出:14 Long is. */
snow;                  
?>
<br />
<br />
<?php $short="No point TEST1";  /* 重新对变量$short赋值。由于这次没有在$short后面添加.(点号),因此$short当前的值为"No point TEST1"。*/
print "15 /$short is $short.";  /* 输出:15 $short is No point TEST1. */
$short="No point TEST2 $short";  /* 重新对变量$short赋值。没在$short的后面添加.(点号),但引用了它自身最近一次的值"No point TEST1"。*/
print "16 /$short is $short.";  /* 输出:16 $short is No point TEST2 No point TEST1. */
Copier après la connexion

Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun.


Recommandations associées :

PHP Connaissances pertinentes et application du téléchargement de fichiers

PHP Boucles - La compréhension des boucles While est liée à l'utilisation de

PHP 5 echo et imprimer les déclarations Connaissance et application

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
À 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!