构造方法与析构方法、对象类型在内存中的分配

构造方法

在每个声明类中都要一个称为构造方法的特殊方法,如果没有显示的声明它,类中会默认存在一个没有参数列表并且内容为空的构造方法。如果显示的声明它,则类中默认的构造方法不存在。当创建一个对象时,构造方法就自动的调用一次,即每次使用关键字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等都可以存储在栈空间段中。

堆空间段

堆是用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张和缩减。用于存储数据长度可变或占用内存比较大的数据。列如:字符串,数组,对象就存储在这段内存中。

数据段

数据段是用来存放可执行文件已初始化全局变量,换句话来说就是存放程序静态分配的变量。

代码段

代码段是用来存放可执行文件的操作指令,也就是说他是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只允许读取操作,不允许写入操作。列如:程序中的函数就是存储在这段代码中的。 对象类型的数据就是一种占用空间比较大的数据类型,并且占用的空间比定长的数据类型,所以对象创建完成后被存放在堆内存中,但是对象的引用名称是存放在栈里面的。程序在运行时,栈内存中的数据是可以直接 存取的,而堆内存是不可以直接存取的,但可以通过对象的引用名称访问对象中的成员。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值