PHP – 繼承



繼承是面向物件程式設計方法的基本原則之一。繼承是一種軟體建模方法,它能夠擴充套件現有類的功能來構建新類,而不是從頭開始構建。

PHP 提供了在其物件模型中實現繼承的所有功能。在 PHP 軟體開發中使用繼承可以實現程式碼重用,消除冗餘的程式碼重複,並進行邏輯組織。

假設您需要設計一個新類,其大部分功能已經在現有類中定義好了。繼承允許您擴充套件現有類,新增或刪除其功能,並開發一個新類。事實上,PHP 具有“extends”關鍵字來建立現有類和新類之間的繼承關係。

class newclass extends oldclass {
   ...
   ...
}

當一個新類(以下稱為繼承類、子類、子類等)與現有類(稱為基類、超類、父類等)存在“IS A”關係時,就會出現繼承。

PHP Inheritence

在 PHP 中,當透過擴充套件另一個類來定義一個新類時,子類會繼承父類的公共和受保護的方法、屬性和常量。您可以自由地覆蓋繼承方法的功能,否則它將保留在父類中定義的功能。

示例

請看下面的示例:

<?php
   class myclass {
      public function hello() {
         echo "Hello from the parent class" . PHP_EOL;      
      }
      public  function thanks() {
         echo "Thank you from parent class" . PHP_EOL;
      }
   }
   class newclass extends myclass {
      public function thanks() {
         echo "Thank you from the child class" . PHP_EOL;
      }
   }

   # object of parent class
   $obj1 = new myclass;
   $obj1->hello();
   $obj1->thanks();

   # object of child class
   $obj2 = new newclass;
   $obj2->hello();
   $obj2->thanks();
?>

它將產生以下輸出

Hello from the parent class
Thank you from parent class
Hello from the parent class
Thank you from the child class

如前所述,子類繼承了父類的公共和受保護的成員(屬性和方法)。子類可以引入額外的屬性或方法。

在下面的示例中,我們使用Book 類作為父類。在這裡,我們建立一個ebook 類,它擴充套件了 Book 類。新類有一個額外的屬性 - format(表示電子書的檔案格式 - EPUB、PDF、MOBI 等)。ebook 類定義了兩個新方法來初始化和輸出電子書資料 - getebook()dispebook()

示例

繼承示例的完整程式碼如下:

<?php
   class Book {
   
      /* Member variables */
      protected int $price;
      protected string $title;

      public function getbook(string $param1, int $param2) {
         $this->title = $param1;
         $this->price = $param2;
      }
      public function dispbook() {
         echo "Title: $this->title Price: $this->price \n";
      }
   }

   class ebook extends Book {
      private string $format;
      public function getebook(string $param1, int $param2, string $param3) {
         $this->title = $param1;
         $this->price = $param2;
         $this->format = $param3;
      }
      public function dispebook() {
         echo "Title: $this->title Price: $this->price\n";
         echo "Format: $this->format \n";
      }
   }
   $eb = new ebook;
   $eb->getebook("PHP Fundamentals", 450, "EPUB");
   $eb->dispebook();
?>

瀏覽器輸出如下所示:

Title: PHP Fundamentals Price: 450
Format: EPUB

如果您仔細檢視 getebook() 函式,前兩個賦值語句實際上是 getbook() 函式,該函式是由 ebook 類繼承的。因此,我們可以使用 parent 關鍵字和作用域解析運算子來呼叫它。

將 getebook() 函式程式碼更改為以下內容:

public function getebook(string $param1, int $param2, string $param3) {
   parent::getbook($param1, $param2);
   $this->format = $param3;
}

類似地,dispebook() 函式中的第一個 echo 語句被替換為對父類中 dispbook() 函式的呼叫:

public function dispebook() {
   parent::dispbook();
   echo "Format: $this->format<br/>";
}

繼承中的建構函式

父類中的建構函式會被子類繼承,但是如果子類定義了自己的建構函式,則不能直接在子類中呼叫父類的建構函式。

為了執行父建構函式,需要在子建構函式中呼叫parent::__construct()

示例

請看下面的示例:

<?php
   class myclass{
      public function __construct(){
         echo "This is parent constructor". PHP_EOL;
      }
   }
   class newclass extends myclass {
      public function __construct(){
         parent::__construct();
         echo "This is child class destructor" . PHP_EOL;
      }
   }
   $obj = new newclass();
?>

它將產生以下輸出

This is parent constructor
This is child class destructor

但是,如果子類沒有建構函式,則它可以像普通類方法一樣從父類繼承(如果它沒有宣告為私有)。

示例

請看下面的示例:

<?php
   class myclass{
      public function __construct(){
         echo "This is parent constructor". PHP_EOL;
      }
   }
   class newclass extends myclass{ }
   $obj = new newclass();
?>

它將產生以下輸出

This is parent constructor

PHP 不允許透過擴充套件多個父類來開發類。您可以進行層次繼承,其中類 B 擴充套件類 A,類 C 擴充套件類 B,依此類推。但是 PHP 不支援多重繼承,其中類 C 試圖同時擴充套件類 A 和類 B。但是,我們可以擴充套件一個類並實現一個或多個介面。我們將在後續章節中學習有關介面的知識。

廣告