购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5 构造方法与析构方法

构造方法是在创建对象实例时自动执行的方法。在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 factorial5);
$fact->showResult();
   >

该脚本执行后会得到如下结果:


__construct()
   执行了. 5 的阶乘为 120.

类似构造方法,有一个析构方法,它在做销毁一个对象或相关的工作。

你可以显式地创建命名为__destruct()析构方法的方法。这种方法将在你的PHP脚本执行结束前执行。为了测试这一点,可以将下面的代码添加到类中:


function __destruct(){
      echo " 对象已销毁."
}

当我们再执行该脚本时,会看到析构方法输出的执行结果: gPfz8Y3ium3GqjIe7eUmeFfxB1DjuN1hhfqlBL7oeXIyxAYoJYhTp1PkF7CMGmqp


__construct()
   执行了. 5 的阶乘为 120. 对象已销毁.

点击中间区域
呼出菜单
上一章
目录
下一章
×