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");
?>
自己動手試一試 »