https://www.cnblogs.com/457248499-qq-com/p/7382413.html
对像在PHP 里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上 说大体上是分为4 段,栈空间段、堆空间段、代码段、初始化静态段,程序里面不同的声明 放在不同的内存段里面。
数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量
代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域,比如函数和方法
栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。
那么数据长度不定长,而且占有空间很大的数据类型的数据放在那内存 的那个段里面呢?这样的数据是放在堆内存里面的。如下图:
栈内存是可以直接存取的,而堆内存是 不可以直接存取的内存。对于我们的对象来数就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可 以使用对象了。
如下就是内存中的四块区域,当我们实例化一个对象,例如$p1=new Person。new Person 的时候会在堆空间去开辟一块地址存放这个对象的属性和方法名,注意,这里是方法名,而不是方法,具体的方法在3区域的代码块中。方法名指向它们。在堆空间开辟出的空间的一连片地址需要有一个变量可以去访问它们,这时候,就会将我们赋予它的变量名存储在栈空间中,并指向这一片含有对象的属性和方法名的区域。