小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
您的位置:首页 > 后端编程 > PHP > PHP基础

PHP的类和对象在内存中的分布情况

分类: PHP基础40个赞

6个类和对象的概念先知道:

1. 对象的本质是一个复杂的变量


2. 类的本质是一个自定义的复杂数据类型


3. 栈区:运行速度快,体积小,保存基本类型


4. 堆区:运行速度稍慢,体积大,保存复杂类型


5. 实例化的过程就是分配内存空间的过程


6. 对象保存在堆区,将堆区的地址保存到栈区。


类、对象是编译器要去处理的东西。所以内存中没有直接存类和对象,如果每个类存一份的话,太浪费了而且没有必要,编译器把用的类、对象 都是拆成了方法和函数。因为他们的逻辑完全一样,只是对象的字段,和一些参数,不一样而已。

因此每个成员函数都有一个隐含的参数叫this,它用来标识具体的哪一个对象。


内存中存在的是:

成员函数(即跑的代码)存一份。

每个对象的成员变量各自存一份。

静态变量、方法存一份。


所以在计算机里面的具体实现上,还是跟C那样。


类的定义和对象的方法在代码区

对象和属性放在一起(就像结构体一样),在堆区(new)或者栈区(栈变量),当然静态变量的话在静态区;


分析如下代码的结构:

<?php
class Student {
	public $name;
	public $sex;
	public function show() {
	}
}

$stu1=new Student;
$stu2=new Student;

$stu1->show();


示意图:

image.png


所以说:

代码区:存放类和对象的代码

栈区:存放属性和方法的引用地址

堆区:存放对应的具体的值

除此之外还有全局区(静态区)存放静态变量,常量区存放常量字符串






拓展阅读:

C/C++编译的程序占用的内存分为以下几个部分:

1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

- 程序结束后由系统释放。

4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。



栈区和堆区的区别


小米技术社区

本站内容均为小米原创,转载请注明出处:小米技术社区>> PHP的类和对象在内存中的分布情况