构造方法是在创建对象实例时自动执行的方法。在PHP中,有两种方法你可以写一个内部类的构造方法。一种是创建一个名为__construct()的方法,也可以创建和类相同名字的方法(这个特性是为了和PHP低版本兼容)。
我们来看一个类代码。这个类的功能是输入任何数值后计算阶乘,如代码清单2-3所示:
代码清单2-3 一个阶乘计算类
<?php class factorial{ private $result = 1; //可以在外部初始化此值 private $number; function __construct($number){ $this->number = $number; for($i=2; $i<=$number; $i++){ $this->result *= $i; } } //显示阶乘结果 public function showResult(){ echo "Factorial of {$this->number} is {$this->result}. "; } }?>
在上面的代码中,我们使用__construct()作为构造函数名称。如果使用factorial名称的方法同时存在,它将会被重命名。
你可能会问,为何一个类中可以有两种风格的构造方法?这意味着一个类中可以有两种构造方法:function__construct()和与类名相同的方法。
那么,PHP会执行构造方法,还是同名方法,还是它们会一起执行?
这是一个很好的问题。其实没有执行两个方法的机会,如果是两个风格的构造方法都在类中出现,PHP虚拟机会优先执行__construct()的方法,其他方法会被忽略。如代码清单2-4所示:
代码清单2-4 使用构造方法
<?php //class.factorial2.php class factorial{ private $result = 1; private $number; function __construct($number){ $this->number = $number; for($i=2; $i<=$number; $i++){ $this->result*=$i; } echo "__construct() executed. "; } function factorial($number){ $this->number = $number; for($i=2; $i<=$number; $i++){ $this->result*=$i; } echo "factorial() executed. "; } public function showResult(){ echo "Factorial of {$this->number} is {$this->result}. "; } }?>
现在,我们使用这个类来创建一个新对象,如代码清单2-5所示:
代码清单2-5 使用阶乘类声明对象
<?php include_once("class.factorial2.php"); $fact = new factorial(5); $fact->showResult(); ?>
该脚本执行后会得到如下结果:
__construct() 执行了. 5 的阶乘为 120.
类似构造方法,有一个析构方法,它在做销毁一个对象或相关的工作。
你可以显式地创建命名为__destruct()析构方法的方法。这种方法将在你的PHP脚本执行结束前执行。为了测试这一点,可以将下面的代码添加到类中:
function __destruct(){ echo " 对象已销毁."; }
当我们再执行该脚本时,会看到析构方法输出的执行结果:
__construct() 执行了. 5 的阶乘为 120. 对象已销毁.