1. PHP对象到底是值传递还是引用传递 手册: 在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。 下面通过一些例子来说明。 PHP 的引用是别名,就是两个不同的变量名字指向相同的内容。 在 PHP 5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回, 或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。 手册上例子: 这里省略. 代码执行情况:
class A{
} $a=new A; $b=$a; $a->name='haha'; echo '<pre>'; var_dump($b); var_dump($a); echo '<hr/>'; function test($obj){ $obj->name='xixi'; } test($a); var_dump($b); var_dump($a); echo '<hr/>'; $a=100; var_dump($a); var_dump($b);
网友一: 对象在函数中是引用传递 即使赋值给其它变量,也是引用 但是改变了$a的类型,准确的说是zval.value指针都变化了,所以此时产生了分裂。 所以: 尽量避免函数内操作外部对象,否则有可能造成致命性的逻辑错误,特别是改变对象数据的时候。 或者在做对象数据传递的时候要注意数据的严谨性。 网友二: $a和$b是同一个标示符的拷贝,都是指向同一个对象A,所以你改变$a或者$b的属性, 其实也就是改变的同一个对象A的属性, 但是$a和$b是两个不同的变量,他们两个不是引用关系。 $a=100, 这里$a已经是变成整数类型,不再指向对象A了,$b还是指向的对象A。 $b = &$a;你改成这样,$a和$b就是引用关系,后面$b也会输出为100。 网友三: 其实$a 和$b 都是指向的是对象的标识符,也就是你输出时看到的#1 ,而这个标识符才是指向的对象。 而当你设置了$b=100 时,此时改变了$b 的指向,但是并不会影响$a 的指向。 关键点: 造成这种疑问的,都是把引用当成指针去理解了. 个人建议: 不要轻易去操作对象, 如果可以使用数组去代替. 后续补充 ... |