Home  >  Article  >  Backend Development  >  Detailed explanation of PHP variable reference and variable destruction mechanism

Detailed explanation of PHP variable reference and variable destruction mechanism

墨辰丷
墨辰丷Original
2018-05-29 17:44:321219browse

Variables are a very important type in php. All our data are operated through variables or constants. Let’s take a look at variable reference and variable destruction. Friends who need it can refer to it

php Variable reference and variable destruction mechanism

In PHP, the symbol "&" represents a reference.

1. Look at the situation without quoting like this:

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

ps: In php, use "=" direct assignment is actually copying a copy of the variable on the right to b, which will generate a memory space. The result may be that the same content is in two copies in the memory. As mentioned in some aspects of PHP performance, this will occupy more memory space. However, in my contacts, most people didn't pay much attention to it. In fact, the significant difference caused by general application in this way is not obvious. You won't see any effect. In fact, I don't often use & for citations, haha. It’s just that I think it is very necessary to have a deep understanding of the implementation principles. I like to focus on fundamental things.

2. Use the symbol & for quoting

$a = “hello world”;
$b = & $a;

When quoting, the PHP engine will not copy a variable. In fact, the pointer points to the address of $a in memory, and $b stores this pointer.
So when using a reference, if you change the value of $b, $a will also change

For example:

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

Explanation: There is a reference in front of $param, so the parameters passed in will not be copied in the memory, but will directly reference the original memory space. So: If the variable value passed in using the symbol & is modified, the value in the original memory space will also be changed.

Take a test as follows:

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

I learned earlier that the mechanism of the php engine is: = will copy the content on the right to the left Variables. So using & means copying the result of the function. In fact, my understanding is that the pointer is given to the variable on the left.

What is a pointer? I used to learn the concept in C language. My understanding is: pointer, pointer, pointing needle (compass, haha). It is easier to understand if you think of a pointer as a memory address. The computer will know where to find data in the memory. This is a superficial understanding, I don’t know how to understand it in depth, haha.

Summary: Use references to reduce memory resource usage.

The explanation of references in the PHP manual is as follows:

References in PHP mean accessing the same variable content with different names. This is not like a C pointer; instead, the reference is a symbol table alias. Note that in PHP, variable names and variable contents are different, so the same content can have different names. The closest analogy is Unix's filenames and the files themselves - the variable names are the directory entries, and the variable contents are the files themselves. References can be thought of as hardlinks in Unix file systems.

3. When destroying variables. It will not change the original value.

Test: $b = & $a;

Since the value of $b is changed, the value of $a also changes. If $b is destroyed (memory It no longer takes up space, it is not null, and it does not have a value of ""). Will the value of $a also be deleted?

In fact, there is a foreign book on PHP that specifically mentions this mechanism. Saw it 2 years ago. I don’t quite remember. The principle is that when a variable is deleted, it will be automatically copied.
In fact, this is to avoid deleting $b and causing the problem of deleting $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
?>

When calling unset to delete the $b variable, the PHP engine discovered from the variable symbol table: the variable $b I wanted to delete originally referenced the variable $ a, this is not easy to delete, because once deleted, the $a variable is gone, so we first copy the $a variable and then delete the $b variable.

About the PHP symbol table: In fact, my understanding is that all variable names during operation are recorded in it and PHP maintains it. The specific data is of course stored in the memory. PHP uses this symbol table to recycle it. Used variable space, release memory space). Go take a look at PHP's garbage collection mechanism (release memory space that is no longer used), which is based on the symbol table.

Example

<?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. */

The above is the entire content of this article, I hope it will be helpful to everyone's learning.


Related recommendations:

PHP Relevant knowledge and application of file upload

PHP Loops - Understanding the While loop is related to the use of

PHP 5 echo and print statements Knowledge and Application

The above is the detailed content of Detailed explanation of PHP variable reference and variable destruction mechanism. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn