构造方法与析构方法、对象类型在内存中的分配
2016-08-20 18:50
441 查看
构造方法
在每个声明类中都要一个称为构造方法的特殊方法,如果没有显示的声明它,类中会默认存在一个没有参数列表并且内容为空的构造方法。如果显示的声明它,则类中默认的构造方法不存在。当创建一个对象时,构造方法就自动的调用一次,即每次使用关键字new 来实例化对象时都会自动调用构造方法,不能主动通过对象引用调用构造方法,所以通常使用构造方法执行一些有用的初始化任务。比如对成员属性在创建对象的时候赋初值。构造方法声明
构造方法与声明其他成员方法相似,但是构造方法的方法名必须是以两个下画线开始 “__construct()” 这是php5中的变化。在php5以前的版本中,构造方法的方法名必须与类名相同,这种方式php5中还是可以用。但是很少用。这样做的好处是可以使构造函数独立于类名,当类名发生变化不需要更改相应的函数名。为了向下兼容,在创建对象时,如果类中没有名为 __construct()的构造方法,PHP将搜索与类名相同的构造方法执行。
<?php header('content-type:text/html;charset=utf-8'); class Person{ var $name; var $sex; var $age; //如果没有传参数则使用默认参数 function __construct($name,$sex='男',$age=22){ $this->name=$name; $this->sex=$sex; $this->age=$age; } function say(){ echo "我的名字:".$this->name." 性别:".$this->sex." 年龄:".$this->age."<br/>"; } function run(){ echo $this->name.'这个人在走路<br/>'; } } $person1=new Person("张三","男",20); $person1->say(); //结果 我的名字:张三 性别:男 年龄:20
注:同一个类中只能声明一个构造方法。
析构方法
与构造方法对应的就是析构方法,析构方法允许在对象销毁一个对象之前执行一些特定的操作。当堆内存段中的对象失去访问它的引用时,它就不能访问了,也就成了垃圾对象了。通常对象的引用被赋予其他的值或者是在页面运行结束时,对象都会失去引用。在php中有一种垃圾回收的机制,当对象不能被访问时就会自动启动垃圾回收的程序,收回对象在堆中占用的内存空间。而析构方法正是在垃圾回收程序回收对象之前调用。
析构方法声明
析构方法在的声明格式与构造方法相似,在类中声明析构方法名称也是固定的。以两个下画线开头的方法名“__destruct()”析构函数不带任何参数。
<?php header('content-type:text/html;charset=utf-8'); class Person{ var $name; var $sex; var $age; //构造函数 function __construct($name,$sex,$age){ $this->name=$name; $this->sex=$sex; $this->age=$age; } function say(){ echo "我的名字:".$this->name." 性别:".$this->sex." 年龄:".$this->age."<br/>"; } function run(){ echo $this->name.'这个人在走路<br/>'; } //析构函数 function __destruct(){ echo "再见".$this->name."<br/>"; } } $person1=new Person("张三","男",20); $person1=null; $person2=new Person("李四","女",30); $person3=new Person("王五","男",40); //结果 再见张三 再见王五 再见李四
我们知道对象的引用一旦失去,这个对象就成为垃圾,垃圾回收程序就会自动启动并回收对象占用的内存。在回收垃圾对象占用的内存之前就会自动调用这个析构方法。上面例子:第一个对象在声明之后,它的引用就被赋值为空,所以第一个对象最先失去引用,不能再访问了,然后自动调用第一个对象中的析构方法输出 “再见张三”。后面两个都是在页面执行结束时失去引用,也都自动调用了析构方法。但因为对象的引用都是存放在栈内存中的,栈的特点是后进先出的特点,最后创建的对象引用先释放,所以先自动调用了第三个对象的析构方法,最后调用第二个对象的析构方法。
对象类型在内存中的分配
对象类型和整型、字符串等类型一样,也是php中的数据类型。都是在程序中用于存储不同的类型数据使用,程序在运行时它的每部分内容都要先加载在内存中再被使用。那么对象类型数据在内存中是如何分配的?逻辑上内存大体上被分为四段,分别是栈空间段,堆空间段,初始化数据段和代码段,程序中不同类型数据类型的声明将会被放在不同的内存段里面,每段内存特点如何。栈空间段
栈的特点是空间小但被cpu访问速度快,是用户存放程序中的临时创建的变量。由于栈是后进先出特点,所以栈方便用来保存和恢复调用现场。从这个意义上来讲,我们可以把堆栈看成一个临时数据寄存、交换的内存区。用来存储占用空间长度不变并且占用空间小的数据类型的内存段,列如整型1,100,10000等在内存中占用空间是等长的,占用空间都是32位4个字节。还有double、boolean等都可以存储在栈空间段中。
堆空间段
堆是用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张和缩减。用于存储数据长度可变或占用内存比较大的数据。列如:字符串,数组,对象就存储在这段内存中。
数据段
数据段是用来存放可执行文件已初始化全局变量,换句话来说就是存放程序静态分配的变量。
代码段
代码段是用来存放可执行文件的操作指令,也就是说他是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只允许读取操作,不允许写入操作。列如:程序中的函数就是存储在这段代码中的。 对象类型的数据就是一种占用空间比较大的数据类型,并且占用的空间比定长的数据类型,所以对象创建完成后被存放在堆内存中,但是对象的引用名称是存放在栈里面的。程序在运行时,栈内存中的数据是可以直接 存取的,而堆内存是不可以直接存取的,但可以通过对象的引用名称访问对象中的成员。
相关文章推荐
- C++ - 对象模型之各种对象的内存分配、构造和析构
- 回顾JavaSE(4)-String(3)四行代码分析String字面值对象和构造方法对象的内存分配
- 类是数据类型,对象是内存的具体分配
- 解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 List<Model对象>或者IQueryable<Model对象>对象
- 黑马程序员-面向对象的理解以及Objective-C方法和对象分配内存的学习笔记
- Boost:managed_mapped_file及C++内存分配和对象构造分析
- PHP面向对象1.2对象类型在内存中的分配
- 在已分配的内存中构造一个对象
- C++ 再谈string类型(1) 构造string对象的方法
- php面向对象基础概念(构造方法和析构方法)
- PHP对象类型在内存中的分配
- 对象类型在内存中的分配
- PHP-----类与对象,成员方法,成员属性,构造方法,析构方法
- 浅谈对象的内存分配及对象的成员的访问(三)--方法的内存分配
- python面向对象开发3 (内部类-构造-析构)魔术方法)
- Objective-C(五、@class,id类型,类对象构造方法,加载和初始化,description,Logging宏)——iOS开发基础
- 使用计算总内存大小的方法确定jvm中为对象分配的存储空间大小
- JavaSE视频学习阶段性总结 三(类的组成,定义,构造方法;对象的创建,内存模型,参数传递)
- 黑马程序员——C语言——常见内存分配函数和构造类型
- PHP对象类型在内存中的分配