通过=
进行赋值。
对于数字,字符串,布尔值,null,数组等,用=
将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。
但是对于对象,用=
赋值,不是拷贝,而是对对象的引用(也不是引用赋值,类似于js中的对象赋值)。
例子
// php 版本5.6.9 $a = 123; $b = $a; $a = 456; print $b; // 123 $aa = array( 0 => 123); $bb = $aa; $aa[0] = 456; print $bb[0]; // 123 // 对象赋值 -- 使用php手册中的例子 class SimpleClass {} $instance = new SimpleClass(); // new 操作符返回的是对所创建对象的引用 $assigned = $instance; // 普通赋值 $reference =& $instance; // 引用赋值 $instance->var = '$assigned will have this value'; $instance = null; // $instance and $reference become null. 改变$instance的值,$assigned的值并没有变化,所以对象的普通赋值不能说就是引用赋值。$reference的赋值才是真正的引用赋值:改变$instance的值,$reference的值跟着变。 var_dump($instance); // null var_dump($reference); // null var_dump($assigned); // SimpleClass 对象
对于对象的赋值可以这么理解:
首先,将PHP中的变量看成是一个一个的数据槽。这个数据槽可以保存一个基本类型(int、string、bool等)。创建引用时,这个槽里保存的是内存地址,或者说是指向引用对象的一个指针,引用没有拷贝操作,仅仅是将指针指向了原变量(参考数据结构)。创建普通赋值时,则是拷贝的基本类型。
而对象则与基本类型不同,它不能直接保存在数据槽中,而是将对象的“句柄”保存在了数据槽。这个句柄是指向对象特定实例的标识符。虽然句柄不是我们所能直观操作的类型,但它也属于基本类型。
当你获取一个包含对象句柄的变量,并将其分配给另一个变量时,另一个变量获取的是这个对象的句柄。(注意,不是引用!不是引用!不是引用!!)。通过句柄,两个变量都可以修改同一个对象。但是,这两个变量并没有直接关系,它们是两个独立的变量,其中一个变量修改为其他值时,并不会对另一个变量产生影响。只有该变量在修改对象内部的内容时,另一个变量因为持有相同的句柄,所以它的对象内容也会相应地发生改变。
php官方手册中关于对象和引用的解释。
使用=&
进行引用赋值。
php手册的例子:
// php 版本5.6.9 $a = 3; $b = &$a; // $b 是 $a 的引用 print "$a\n"; // 输出 3 print "$b\n"; // 输出 3 $a = 4; // 修改 $a print "$a\n"; // 输出 4 print "$b\n"; // 也输出 4,因为 $b 是 $a 的引用,因此也被改变