選單
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP 如何做 W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

PHP 教程

PHP HOME PHP 簡介 PHP 安裝 PHP 語法 PHP 註釋 PHP 變數 PHP Echo / Print PHP 資料型別 PHP 字串 PHP 數字 PHP 型別轉換 PHP 數學 PHP 常量 PHP 魔術常量 PHP 運算子 PHP If...Else...Elseif PHP Switch PHP 迴圈 PHP 函式 PHP 陣列 PHP 超全域性變數 PHP 正則表示式

PHP 表單

PHP 表單處理 PHP 表單驗證 PHP 表單必填項 PHP 表單 URL/電子郵件 PHP 表單完成

PHP 高階

PHP 日期和時間 PHP Include PHP 檔案處理 PHP 檔案開啟/讀取 PHP 檔案建立/寫入 PHP 檔案上傳 PHP Cookies PHP Sessions PHP 過濾器 PHP 高階過濾器 PHP 回撥函式 PHP JSON PHP 異常

PHP OOP

PHP 什麼是 OOP PHP 類/物件 PHP 建構函式 PHP 解構函式 PHP 訪問修飾符 PHP 繼承 PHP 常量 PHP 抽象類 PHP 介面 PHP Trait PHP 靜態方法 PHP 靜態屬性 PHP 名稱空間 PHP 可迭代物件

MySQL 資料庫

MySQL 資料庫 MySQL 連線 MySQL 建立資料庫 MySQL 建立表 MySQL 插入資料 MySQL 獲取最後 ID MySQL 插入多條資料 MySQL 預處理 MySQL 查詢資料 MySQL Where MySQL Order By MySQL 刪除資料 MySQL 更新資料 MySQL 限制資料

PHP XML

PHP XML 解析器 PHP SimpleXML 解析器 PHP SimpleXML - 獲取 PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX 簡介 AJAX PHP AJAX 資料庫 AJAX XML AJAX 即時搜尋 AJAX 投票

PHP 示例

PHP 示例 PHP 編譯器 PHP 測驗 PHP 練習 PHP 伺服器 PHP 證書

PHP 參考手冊

PHP 概述 PHP 陣列 PHP 日曆 PHP 日期 PHP 目錄 PHP 錯誤 PHP 異常 PHP 檔案系統 PHP 過濾器 PHP FTP PHP JSON PHP 關鍵詞 PHP Libxml PHP 郵件 PHP 數學 PHP 雜項 PHP MySQLi PHP 網路 PHP 輸出控制 PHP 正則表示式 PHP SimpleXML PHP Stream PHP String PHP 變數處理 PHP XML 解析器 PHP 壓縮 PHP 時區

PHP OOP - 抽象類


PHP - 什麼是抽象類和抽象方法?

抽象類和抽象方法是指父類有一個已命名的類,但需要其子類來完成具體的任務。

抽象類是指一個類中至少包含一個抽象方法。抽象方法是隻宣告但未在程式碼中實現的方法。

抽象類或抽象方法使用 abstract 關鍵字定義。

語法

<?php
abstract class ParentClass {
  abstract public function someMethod1();
  abstract public function someMethod2($name, $color);
  abstract public function someMethod3() : string;
}
?>

當從抽象類繼承時,子類的方法必須具有相同的名稱,以及相同或限制較少的訪問修飾符。因此,如果抽象方法被定義為 protected,那麼子類的方法必須定義為 protected 或 public,但不能是 private。同樣,必需引數的型別和數量也必須相同。但是,子類可以有額外的可選引數。

所以,當一個子類繼承自一個抽象類時,我們有以下規則:

  • 子類的方法必須具有相同的名稱,並且重新聲明瞭父類的抽象方法。
  • 子類的方法必須具有相同或限制較少的訪問修飾符。
  • 必需引數的數量必須相同。但是,子類可以有額外的可選引數。

我們來看一個例子

示例

<?php
// 父類
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() : string;
}

// 子類
class Audi extends Car {
  public function intro() : string {
    return "Choose German quality! I'm an $this->name!";
  }
}

class Volvo extends Car {
  public function intro() : string {
    return "Proud to be Swedish! I'm a $this->name!";
  }
}

class Citroen extends Car {
  public function intro() : string {
    return "French extravagance! I'm a $this->name!";
  }
}

// 從子類建立物件
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
自己動手試一試 »

示例解釋

Audi、Volvo 和 Citroen 類繼承自 Car 類。這意味著 Audi、Volvo 和 Citroen 類可以因為繼承而使用 Car 類中的 public $name 屬性以及 public __construct() 方法。

但是,intro() 是一個抽象方法,它應該在所有子類中定義,並且它們應該返回一個字串。



PHP - 更多抽象類示例

讓我們看另一個抽象方法帶引數的例子:

示例

<?php
abstract class ParentClass {
  // 帶引數的抽象方法
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  public function prefixName($name) {
    if ($name == "John Doe") {
      $prefix = "Mr.";
    } elseif ($name == "Jane Doe") {
      $prefix = "Mrs.";
    } else {
      $prefix = "";
    }
    return "{$prefix} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
自己動手試一試 »

讓我們看另一個抽象方法帶引數的例子,並且子類有兩個可選引數,而這些引數在父類的抽象方法中並未定義:

示例

<?php
abstract class ParentClass {
  // 帶引數的抽象方法
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  // 子類可以定義父類抽象方法中沒有的可選引數
  public function prefixName($name, $separator = ".", $greet = "Dear") {
    if ($name == "John Doe") {
      $prefix = "Mr";
    } elseif ($name == "Jane Doe") {
      $prefix = "Mrs";
    } else {
      $prefix = "";
    }
    return "{$greet} {$prefix}{$separator} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
自己動手試一試 »

×

聯絡銷售

如果您想將 W3Schools 服務用於教育機構、團隊或企業,請傳送電子郵件給我們
sales@w3schools.com

報告錯誤

如果您想報告錯誤,或想提出建議,請傳送電子郵件給我們
help@w3schools.com

W3Schools 經過最佳化,旨在方便學習和培訓。示例可能經過簡化,以提高閱讀和學習體驗。教程、參考資料和示例會不斷審查,以避免錯誤,但我們無法保證所有內容的完全正確性。使用 W3Schools 即表示您已閱讀並接受我們的使用條款Cookie 和隱私政策

版權所有 1999-2024 Refsnes Data。保留所有權利。W3Schools 由 W3.CSS 提供支援