网上看到一篇文章很好,其中:$p1=new Person();对象的首地址赋给“$p1”这个引用变量,所以$p1 是存储对象首地址的变量,$p1 放在栈内存里边,$p1 相当 于一个指针指向堆里面的对象,所以我们可以通过$p1 这个引用变量来操作对象,通常我们也 称对象引用为对象。但是对于php手册中抢到&并非C语言中的指针地址,让我有种疑问,于是向前辈及大侠们请教了下,得到了大家确认的支持排除了疑惑。再次记录下来补充实例以备温故知新。

对像在PHP 里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?

内存从逻 辑上 说大体上是分为4 段,栈空间段、堆空间段、代码段、初始化静态段,程序里面不同的声明 放在不同的内存段里面。

数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量;

代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域,比如函数和方法;

栈空间段是 存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。

堆内存 数据长度不定长,而且占有空间很大的数据类型的数据。如下图:

栈内存是可以直接存取的,而堆内存不可以直接存取。$p1=new Person(); $p2=new Person(); $p3=new Person();
对于我们的对象来说就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可以使用对象了。
$p1 就是我们实例出来的对象名称,同理,$p2,$p3 也是我们实例出来的对象名称,一个类可以实例出多个对象,每个对象都是独立的,
上面的代码相当于实例出来3 个人来,每个人之间是没有联系的,只能说明他们都是人类,每 个人都有自己的姓名,性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体 现出 来的成员属性和成员方法,实例化出来的对象里面就包含了这些属性和方法。
$p1=new Person();
对于这个条代码,$p1 是对象名称在栈内存里面new Person()是真正的对象是在堆内存 里面的,具体的请看下图:
从上图可以看出$p1=new Person();等号右边是真正的对象实例,在堆内存里面的实体, 
上图一共有3 次new Person(),所以会在堆里面开辟3 个空间,产生3 个实例对象,每个对象之间都是相互独立的,使用自己的空间,
在PHP 里面,只要有一个new 这个关键字出现就会 实例化出来一个对象,在堆里面开辟一块自己的空间。 
每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有 姓 名、性别和年龄。每个属性又都有一个地址。 
$p1=new Person();等号的右边$p1 是一个引用变量,通过赋值运算符“=”把对象的首地址 赋给“$p1”这个引用变量,所以$p1 是存储对象首地址的变量,$p1 放在栈内存里边,$p1 相当 于一个指针指向堆里面的对象,所以我们可以通过$p1 这个引用变量来操作对象,通常我们也 称对象引用为对象。 
当时看到这里没有完全相信,为此处特意做了验证:

class Person{
  public $name;
}

$obj1 = new Person();
$obj1->name = "test1";
echo $obj1->name;
$obj2 = $obj1;
$obj2->name = "test2";
echo $obj1->name;
echo $obj2->name;

通过测试结果来看,解释是对的。
$p1 是对象的指针而不是对象本身, obj2和 obj1都指向同一块内存,同一个对象。这一点和OOP语言是一样

object(Person)[2] 
public 'name' => string 'test2' (length=5)

object(Person)[2]
public 'name' => string 'test2' (length=5)
可见对象的ID号是一个

如果想得到一个对象的副本,用$obj2 =clone $obj1;  用了clone后会产生一个新对象,分配内存,独立于原来的obj1
参见手册此页  http://www.php.net/manual/zh/language.oop5.cloning.php

$obj2 = $obj1;
$obj2 = &$obj1;
一样的效果,一样的解释?
对于object来说,是一样的。 对于普通的变量是不一样的。
$a = 1;
$b = $a;
$c = &$a;
不一样的

php对象在内存中的分配相关推荐

  1. 【转】PHP对象在内存中的分配

    对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上 说大体上是分为4 段,栈空间段.堆空 ...

  2. python里面的类和对象_Python中类和对象在内存中是如何保存?

    类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...

  3. JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配

    文章目录 前言 零.排序规范 1.happens-before原则 2.找文档位置 一.一线互联网企业关于对象面试题: (后面回答的就是这几个问题) 二.对象创建过程 三.对象在内存中的存储布局 1. ...

  4. [转载] java对象在内存中的结构

    参考链接: 了解Java中的类和对象 今天看到一个不错的PPT:Build Memory-efficient Java Applications,开篇便提出了一个问题,在Hotspot JVM中,32 ...

  5. Java数组在内存中的分配

    Java数组在内存中的分配 在Java中,数组存储对象的原始值(int,char,...)或引用(也称为指针). 使用"new"创建对象时,会在堆中分配一个内存空间并返回一个引用. ...

  6. 实现 对象在内存中的引用一致性 之第一步

    原委 废话不要,他们都该删. 虽然写了个 基于数据库的代码生成器 与大家分享,但并不擅长数据库开发:相反,面向对象才是我的爱. 多年的酝酿让我收获良多,直觉这是个令人激动的开发模式. 或许是因为高中学 ...

  7. 对象在内存中的存储布局

    对象头包含: markword(和锁相关的信息)  8字节 class pointer(说明对象属于哪个类),jvm指针八字节,但是默认压缩,所有4个字节 对象体包含: instance word实例 ...

  8. 单个对象和多个对象在内存中的结构图

    单个对象在内存中的结构图: 多个对象在内存中的结构图: (注:图片来至http://www.itheima.com/ 视频教程截图,转载请说明出处)

  9. java对象的内存结构_Java对象在内存中的结构分析

    问题:在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头.实例数据和对齐填充,其中对象头又分为:Mark ...

  10. Bitmap对象在内存中的大小和转化为字节流的大小

    查看我的博客原文:Android – Bitmap 内存管理 Bitmap对象在内存中的大小 比如我们构造Bitmap时设置宽200,高400,色彩模式为Bitmap.Config.ARGB_8888 ...

最新文章

  1. 从外卖小哥到月入两万的城市经理,他在无锡见证外卖大战
  2. Sql Server 2012 分页方法分析(offset and fetch)
  3. BZOJ3238: [Ahoi2013]差异
  4. python实现序列数据预处理_Python笔记:序列处理函数
  5. 命令行使用.so文件内的函数_如何使用SFC命令行工具修复Windows 10系统文件
  6. Spring Boot 2.0(三):Spring Boot 开源软件都有哪些?
  7. 通过Excel访问Kylin
  8. 有关提高visual studio开发效率的方法
  9. Ajax Toolkit AutoComplete 几种用法
  10. 静物摄影用光技巧_详解摄影用光技巧,用好光线,拍出好照片。
  11. Gobblin编译支持CDH5.4.0
  12. IDM无法连接到目标服务器
  13. 圈圈usb cannot convert from 'BOOL (__thiscall CMyUsbHidTestAppDlg::* )(UINT,DWORD)' to 'LRESULT (__
  14. GUI输出中文为乱码解决方式
  15. 我自己制作的导航页网站,源码免费分享~
  16. APIO2007风铃
  17. 【算法导论-主定理】用主方法求解递归式 学练结合版
  18. 傅里叶级数、狄利克雷收敛定理、周期延拓
  19. 浅谈2023年Android开发技术趋势,什么值得学?
  20. 20155209 20155230 《信息安全技术》实验四 木马及远程控制技术

热门文章

  1. 伙伴算法的核心思想是回收时进行相邻块的合并_Linux内存管理之伙伴算法
  2. OpenCV-图像处理(17、Sobel算子)
  3. python中write的用法_python中write方法是如何使用?
  4. 浙大计算机学院 数字媒体处理与企业智能计算实验室在哪个校区,浙大计算机学院各大实验室介绍.pdf...
  5. 【2019上海网络赛:K】Peekaboo(勾股数知c求a和b--数论)
  6. 【python】Mac在Pycharm中导入python3.6(简单易行)
  7. hdu 5446 Lucas+中国剩余定理(孙子定理)+按位乘
  8. 射极跟随器实验报告数据处理_电压跟随器秘笈:运放构成电压跟随器的稳定性问题探讨...
  9. MATLAB--卡尔曼滤波
  10. tensorflow.keras搭建gan神经网络,可直接运行