PHP – 建構函式和解構函式



與大多數面嚮物件語言一樣,您也可以在 PHP 中的類中定義建構函式。當您使用 new 運算子宣告物件時,其成員變數不會分配任何值。建構函式用於在宣告時初始化每個新物件。PHP 還支援具有解構函式,該函式會在物件不再有任何引用時將其從記憶體中銷燬。

__construct() 函式

PHP 提供了一個 __construct() 函式來初始化物件。

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

類中的構造方法會在每個新建立的物件上自動呼叫。請注意,定義建構函式不是強制性的。但是,如果存在,它適用於物件在使用前可能需要的任何初始化。

您可以將任意數量的引數傳遞到建構函式中。__construct() 函式沒有任何返回值。

讓我們在上一章中使用的 Book 類中定義一個建構函式

<?php
   class Book {
   
      /* Member variables */
      var $price;
      var $title;

      /*Constructor*/
      function __construct(){
         $this->title = "PHP Fundamentals";
         $this->price = 275;
      }
	  
      /* Member functions */
      function getPrice() {
         echo "Price: $this->price \n";
      }

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

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

它將產生以下輸出 -

Title: PHP Fundamentals
Price: 275

引數化建構函式

由於在宣告物件時呼叫了建構函式,因此 $b1 的成員變數已初始化,而無需呼叫 setTitle() 和 setPrice() 方法。但是,此建構函式將為每個物件呼叫,因此每個物件具有相同的值的 title 和 price 屬性。

要使用不同的值初始化每個物件,請使用引數定義__construct() 函式。

__construct() 函式的定義更改為以下內容 -

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

要初始化物件,請在宣告中的括號內將值傳遞給引數。

$b1 = new Book("PHP Fundamentals", 375);

示例

現在,您可以使每個物件對成員變數具有不同的值。

<?php
   class Book {
   
      /* Member variables */
      var $price;
      var $title;

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

      /* Member functions */
      function getPrice(){
         echo "Price: $this->price \n";
      }

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

   $b1 = new Book("PHP Fundamentals", 375);
   $b2 = new Book("PHP Programming", 450);

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

它將產生以下輸出 -

Title: PHP Fundamentals
Price: 375
Title: PHP Programming
Price: 450

建構函式過載

方法過載是面向物件程式設計中一個重要的概念,其中一個類可能有多個建構函式定義,每個定義具有不同數量的引數。但是,PHP 不支援方法過載。此限制可以透過在建構函式中使用具有預設值的引數來克服。

將 __construct() 函式更改為以下內容 -

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

現在,宣告一個物件而不傳遞引數,另一個物件則傳遞引數。一個不帶引數的物件將使用預設引數初始化,另一個則使用傳遞的值初始化。

$b1 = new Book();
$b2 = new Book("PHP Programming", 450);

它將產生以下輸出 -

Title: PHP Basics
Price: 380
Title: PHP Programming
Price: 450

建構函式中的型別宣告

由於 PHP(從版本 7.0 開始)允許對函式引數進行標量型別宣告,因此可以將 __construct() 函式定義為 -

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

在早期版本的 PHP 中,允許使用類名稱來定義建構函式,但此功能自 PHP 版本 8.0 以來已被棄用。

__destruct() 函式

PHP 還具有 __destructor() 函式。它實現了類似於其他面嚮物件語言(如 C++)的解構函式概念。析構方法將在沒有其他對特定物件的引用時被呼叫。

__destruct(): void

__destruct() 函式沒有任何引數,也沒有返回值。可以透過在函式內部放置 var_dump($this) 來驗證 __destruct() 函式在任何物件超出範圍時自動呼叫的事實。

如上所述,$this 攜帶對呼叫物件的引用,轉儲顯示成員變數設定為 NULL

在 Book 類中新增解構函式,如下所示 -

function __destruct() {
   var_dump($this);
   echo "object destroyed";
}

程式退出時,將顯示以下輸出 -

object(Book)#1 (2) {
   ["price"]=>
   NULL
   ["title"]=>
   NULL
}
object destroyed
廣告