大多数类都有一种称为构造函数的特殊方法。每当由该类实例化创建一个对象时,程序将自动调用其构造函数,也就是使用 new 这个关键字来实例化对象的时候会自动调用构造函数。构造函数的声明与其它操作的声明一样,只是其名称必须是 __construct()。这是 php5 中的变化,以前的版本中,构造函数的名称必须与类名相同这种在 php5 中仍然可以用,但现在以经很少有人用了。统一使用 __construct() 这样做的好处是可以使构造函数独立于类名,当类名发生改变时不需要改相应的构造函数名称。为了向下兼容,如果一个类中没有名为 __construct() 的方法,php 将搜索一个 php4 中的写法,与类名相同名的构造方法。

构造函数 __construct()

构造函数与普通的函数相似,遵循以下格式

function __construct(参数){

      //代码

}

下面还是让我们来通过例子说明,比方说,我希望能在实例化圆类的时候就为圆对象设定好半径,那就得为圆类添加一个构造函数

<?php

class circle {

    var $radius;

    function __construct($radius) {      //构造函数
        $this->radius = $radius;
    }

    function getGirth() {
        echo 2 * 3.14 * $this->radius;
    }

    function getArea() {
        echo 3.14 * $this->radius * $this->radius;
    }

}

$c1=new circle(3);                       //实例化一个半径为 3 的圆
echo "The girth of this circle is ";
$c1->getGirth();
echo "<br />The area of this circle is ";
$c1->getArea();

?>

程序运行结果:

The girth of this circle is 18.84
The area of this circle is 28.26

当然了,如果你正在使用 php4 或以下版本,你应该这么写 circle 类:

class circle {

    var $radius;

    //php4 及以下请遵循构造函数与类名相同的规则
    function circle($radius) {      //构造函数
        $this->radius = $radius;
    }

    function getGirth() {
        echo 2 * 3.14 * $this->radius;
    }

    function getArea() {
        echo 3.14 * $this->radius * $this->radius;
    }

}

要注意的是在一个类中只能声明一个构造方法,而且只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。比如对成属性在创建对象的时候赋初值。

析构函数 __destruct()

与构造函数相对的就是析构函数。析构函数是 php5 新添加的内容,在 php4 中没有析构函数。析构函数允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件,释放结果集等,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,也就是对象在内存中被销毁前调用析构函数。与构造函数的名称类似,一个类的析构函数名称必须是 __destruct()析构函数不能带有任何参数

析构函数也与普通的函数相似,遵循以下格式

function __destruct(){    //注意析构函数不能带参数
      //代码
}

让我们继续以圆类做例子:

<?php

class circle {

    var $radius;

    function __construct($radius) {
        $this->radius = $radius;
        echo "<br />The circle is created and its radius is ".$this->radius;
    }

    function __destruct(){
        echo "<br />The circle is destoryed and its radius is ".$this->radius;
    }

    function getGirth() {
        echo 2 * 3.14 * $this->radius;
    }

    function getArea() {
        echo 3.14 * $this->radius * $this->radius;
    }

}

$c1=new circle(1);  
$c2=new circle(2);  
$c3=new circle(3);    

?>

程序运行结果:

The circle is created and its radius is 1
The circle is created and its radius is 2
The circle is created and its radius is 3
The circle is destoryed and its radius is 3
The circle is destoryed and its radius is 2
The circle is destoryed and its radius is 1

细心的同学已经发现,在创建圆类的时候是按照 $c1,$c2,$c3 的顺序创建,然而销毁的时候顺序却是反的。

由于类实例是以堆栈的形式放在内存中,所以最后调用析构函数的时候,输出顺序是按后进先出的原则!