q456123 发表于 2017-4-12 10:54:50

[学习笔记]PHP中=赋值操作符对不同数据类型的不同行为

  作为一个PHP的新手,一直对PHP的引用困惑了很久,今晚仔细看了用户手册和做了一些实验,终于明白了其中的原理和细节,特别是=操作符对于不同类型的不同行为。
  首先解释赋值操作符=的行为,看下面的例子:
PHP 代码

[*]$i = 0;   
[*]$j = $i;   
[*]$j = 0;   
[*]echo $j;   // 打印输出0   
[*]
[*]$arr = array(0);
[*]$arr2 = $arr;
[*]$arr2 = 1;
[*]echo $arr; //打印输出0
[*]  
[*]class B   
[*]{   
[*]    public $i = 0;   
[*]}   
[*]  
[*]$b = new B();   
[*]$c = $b;   
[*]$c->i = 1;   
[*]echo($b->i);  // 打印输出1  

  从这个例子可以看出,如果=操作符右边的变量为基本数据类型或者数组,那么=操作符把右边变量的一份拷贝赋值给左边变量;如果右边变量不是基本数据类型或者数组,如class,那么=会把一个指向右边变量的引用赋值给左边变量。注意:是指向右边变量的引用,而不是指向右边变量所指的内容区域的引用;具体看下边的例子
PHP 代码

[*]$a = new A();   
[*]$b_a = $a;   
[*]$b_r = &$a;   
[*]  
[*]$b_a = null;   
[*]var_dump($a);  //打印 object(A),$a所指向的内容还在   
[*]$b_r = null;   
[*]var_dump($a); // 打印 null,$a所指向的内容被清除了  

  上面的例子也说明了,如果用 $var = &$a 的方式赋值的话,用$var=null来销毁变量$var的话事实上是把$var所指内容被设置null了,其实这句话也暗示了任何一个指向该内容区域的引用变量均可用来销毁该内容区域的内容。所以,要销毁变量$var的话用 unset($var) 。PS:事实上一这种方式赋值$var只是个引用,占用不了多少内存,要不要销毁没所谓,这里这是说下必须用unset的方式销毁。
  下面则是《用户手册》中的“引用的解释”的例子:
PHP 代码

[*]<!---->
[*]$a =& $b;   
[*]?>   

  下边有这么一句解释:
  这意味着 $a 和 $b 指向了同一个变量。
  注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。

 引用是什么?

[*]在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身――变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的紧密连接。    



  关于“引用是什么”的一点解释:
PHP 代码

[*]int i = 0;   
[*]int j = 0;   
[*]int *p = &i;   
[*]p = &j;  


  上面的代码中,p是一个指向i的内存地址的指针,而*p才是其中的内容;p=&j指向改变了p指针的指向,用*p=111的表达式才会改变i的内容。而PHP中则不是,下面的例子
PHP 代码

[*]$i = 0;   
[*]$p = &$i;  

  $p = 111则马上会改变$i的值。
页: [1]
查看完整版本: [学习笔记]PHP中=赋值操作符对不同数据类型的不同行为