看过上节内容,我们继续研究。我们的打印函数ln_dump()(var_dump改造版)可以打印出各种数据类型,如果用它打印下对象:
打印出来的结果:
对象的值都是类似于object(Person)#1、object(Person)#2这样的值,它们就是对象的标识符,对象变量真正存储的数据。我们可以把它理解为指向对象堆空间的指针,对象数据存在堆空间。
回顾下PHP变量传值分两种:值传递与引用传递,默认变量都是值传递。
使用“&”才能实现引用传递:
PHP对象变量默认的也是值传递,由于PHP对象变量存的是“对象标识符”,给我们的感觉它又像默认的是引用传递。
第10行代码明明只修改了$p1,怎么$p2->name也变成了“超级楠神二号”
看图理解:
对象变量:
则对象变量复制的时候,值传递就变成这样:
对象变量进行普通传值的时候,复制的是对象变量中所存储的“对象标识符”,所以才会出现类似“引用传值”的效果。
第13、14行打印两个对象变量,看看对象标识符是否一样:
都是object(Person)#1。
假如新实例化一个对象:
第17行新实例化对象$p3,赋值给$p1,那$p1的对象标识符肯定会和$p3的一样:
关于对象变量的引用传值楠神就不演示了,自己感兴趣可做测试。因为给对象变量做引用传值实际应用不常见,没必要把程序搞得那么绕。
《PHP变量在内存中的表示》可以从这篇文章更深次了解PHP对象的传值问题。