PHP构造方法和析构函数

<?php

// 构造方法PHP5可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,

//因此常用来在对象创建的时候进行一些初始化工作。

class Person {

    public  $name;

    public  $age;

    public  function __construct($name,$age)

    {

        $this->name = $name;

        $this->age = $age;

        echo $this->name."被创建!<br/>";

    }

    // 析构方法 析构方法指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数

    public function __destruct() 

    {

     // 释放资源

        echo $this->name."被销毁!<br/>";

    }

}

$people = new Person("大强",20);

echo $people->name."<br/>";

$people1 = new Person("小强",20);

//详细解说:

父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct() 。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。 

析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余关闭操作的运行。 

Note:

析构函数在脚本关闭时调用,此时所有的 HTTP 头信息已经发出。脚本关闭时的工作目录有可能和在 SAPI(如 apache)中时不同。

Note:

试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。

完全分析:

构造函数和析构函数,先说明一下同一个类的对象之间的不同之处:首先,对象名不相同。其次,对象的数据成员的值不相同。我们在声明一个对象时,可以 对其初始化。如果对其初始化,那么程序会向操作系统申请为其分配一定的内存空间,在为其分配内存空间时,会将初始化写入内存单元中。问题是,我们不能像初 始化一般变量那样,在对其初始化时,将初始值写入内存单元中,这是因为相对于这种初始化方法来说,类的对象太过复杂。

构造函数:我们用构造函数来初始化类的对象。C++在创建对象时,都会调用构造函数。构造函数是一种特殊的类成员函数,当然可以直接访问类的所有数据成员;可以是内联函数,可以有形参列表,可以有默认形参值,可以重载。

我们可以将一个变量的值,赋给同一类型的另一个变量,对于类的对象来说,也可以将一个对象的内容,拷贝给同一类的另一个对象。拷贝的方法可以是将一 个对象的数据变量的值,分别赋给另一个对象的相应数据变量。但是如果数据变量很多,这种方法就显得有些麻烦。也可以用一种特殊的构造函数,来实现用一个已 经存在的对象来初始化另一个对象这种功能。

拷贝构造函数:一种特殊的构造函数,也是用来构造对象的,具有构造函数的所有特性。拷贝构造函数能利用一个已存在的对象初始化同一类的另一个对象。拷贝构造函数的形参是本类的对象的引用。(为什么必须是引用?)

拷贝构造函数在以下三种情况下会被调用:当用类的一个对象初始化该类的另一个对象时,系统自动调用拷贝构造函数实现对象间的拷贝赋值;当某个函数的 形参是某个类的对象时(可以是对象的引用吗?),当调用这个函数,实参赋值给形参时,系统就自动调用拷贝构造函数;当某个函数的返回值是某个类的对象时, 调用拷贝构造函数。最后的一种情况:函数func的返回值是A,对象A是在函数func内部的局部变量,当函数func执行完之后就被释放。调用函数 func的语句是:B=func()。对象B是这样被对象A赋值的:当编译器执行B=func()时,会创建一个临时无名变量。当func函数执行 return A;语句之时,实际是调用拷贝构造函数,将对象A的值拷贝给那个临时变量,之后释放A占用的内存空间。之后再用拷贝构造函数,将临时变量的值拷贝到对象B 中。

析构函数:自然万物都有生命周期,类的对象也不例外。如果在某一个函数中声明了一个对象,在函数执行结束,返回调用函数时,声明的对象就会被释放。 析构函数的作用与构造函数的相反。析构函数是在对象要被删除时,系统自动调用的。执行完析构函数之后,对象占用的内存被释放。如果我们希望在删除对象时做 一些相关的清理工作,就可以把它们写在该类的析构函数中。

PS:大强原创:详细如有不懂请联系:18825121252

相关推荐