PHP – 构造函数和析构函数


与大多数面向对象语言一样,您也可以在 PHP 的类中定义构造函数。使用 new 运算符声明对象时,不会为其成员变量分配任何值。

构造函数 用于在声明时初始化每个新对象。PHP 还支持使用 析构函数 从内存中销毁对象,因为它不再有任何引用。

构造函数

PHP 提供了一个 __construct() 函数来初始化一个对象。


 __construct(mixed ...$values = ""): void

类中的构造函数方法在每个新创建的对象上自动调用。请注意,定义构造函数不是必需的。但是,如果存在,则它适用于对象在使用之前可能需要的任何初始化。

你可以将任意数量的参数传递到 构造函数 中。__construct() 函数没有任何返回值。

让我们在上一章中使用的 Book 类中定义一个构造函数


<?php
   class Book {
   
      /* 成员变量 */
      var $price;
      var $title;

      /* 构造函数 */
      function __construct(){
         $this->title = "PHP 基本知识";
         $this->price = 275;
      }
      
      /* 成员函数 */
      function getPrice() {
         echo "价格: $this->price \n";
      }

      function getTitle(){
         echo "标题: $this->title \n";
      }    
   }

   $b1 = new Book;
   $b1->getTitle();
   $b1->getPrice();
?>

它将产生以下输出 -

标题: PHP 基本知识
价格: 275

参数化构造函数

$b1 的成员变量已初始化,而不必调用 setTitle() 和 setPrice() 方法,因为构造函数是在声明对象后立即调用的。但是,将为每个对象调用此构造函数,因此每个对象具有相同的 title price 属性值。

要使用不同的值初始化每个对象,请使用参数定义 __construct() 函数。

将 __construct() 函数的定义更改为以下内容 -


function __construct($param1, $param2) {
   $this->title = $param1;
   $this->price = $param2;
}

要初始化对象,请将值传递给声明中括号内的参数。


 $b1 = new Book("PHP 基本知识", 375);

例子

现在,您可以让每个对象对成员变量具有不同的值。


<?php
   class Book {
   
      /* 成员变量 */
      var $price;
      var $title;

      /* 构造函数 */
      function __construct($param1, $param2) {
         $this->title = $param1;
         $this->price = $param2;
      }

      /* 成员函数 */
      function getPrice(){
         echo "价格: $this->price \n";
      }

      function getTitle(){
         echo "标题: $this->title \n";
      }
   }

   $b1 = new Book("PHP 基本知识", 375);
   $b2 = new Book("PHP 编程知识", 450);

   $b1->getTitle();
   $b1->getPrice();
   $b2->getTitle();
   $b2->getPrice();
?>

它将产生以下输出 -

标题: PHP 基本知识
价格: 375
标题: PHP 编程知识
价格: 450

构造函数重载

方法重载是面向对象编程中的一个重要概念,其中一个类可能具有多个构造函数定义,每个定义具有不同数量的参数。但是,PHP 不支持方法重载。可以通过在 构造函数 中使用具有默认值的参数来克服此限制。

__construct() 函数更改为以下内容 -


function __construct($param1="PHP 基本知识", $param2=380) {
   $this->title = $param1;
   $this->price = $param2;
}

现在,声明一个对象而不传递参数,另一个对象带有参数。一个没有参数的参数将使用默认参数进行初始化,另一个参数将使用传递的值进行初始化。


$b1 = new Book();
$b2 = new Book("PHP 编程知识", 450);

它将产生以下输出 -

Title: PHP 基本知识
Price: 380
Title: PHP 编程知识
Price: 450

构造函数的类型声明

由于 PHP(7.0 版以上)允许对函数参数进行标量类型声明,因此 __construct() 函数可以定义为 −


function __construct(string $param1="PHP 基本知识", int $param2=380) {
   $this->title = $param1;
   $this->price = $param2;
}

注意:PHP 早期版本允许使用类的名称来定义构造函数,但从 PHP 版本 8.0 开始,此功能已被弃用。

析构函数

PHP 也有一个 __destructor() 函数。它实现的析构函数概念类似于其他面向对象的语言,如 C++ 的 析构函数 概念。一旦没有对特定对象的其他引用,就会调用 析构函数 方法。


 __destruct(): void

__destruct() 函数没有任何参数,也没有任何返回值。当任何对象超出范围时,会自动调用 __destruct() 函数这一事实可以通过将 var_dump($this) 放入函数中来验证。

如上所述,$this 带有对调用对象的引用,则转储显示成员变量设置为 NULL

Book 类中添加析构函数,如下所示 -


function __destruct() {
   var_dump($this);
   echo "对象被销毁";
}

当程序退出时,将显示以下输出 -

object(Book)#1 (2) {
   ["price"]=>
   NULL
   ["title"]=>
   NULL
}
对象被销毁