在 PHP 中,接口是一種定義方法但不實現它們的方式。接口可以被類實現,使得這些類承諾實現接口中定義的所有方法。接口主要用于定義類的共同行為,而不涉及具體的實現細節。以下是 PHP 接口的基本用法:
定義接口
interface Animal { public function makeSound(); public function eat(); }
現在,Animal 接口定義了兩個方法:
makeSound():用來讓動物發出聲音。eat():用來描述動物進食的行為。
實現接口的類
你需要在實現了 Animal 接口的類中提供這兩個方法的具體實現:
phpCopy Code
class Dog implements Animal {
public function makeSound() {
echo "汪汪";
}
public function eat() {
echo "狗在吃食物";
}
}
class Cat implements Animal {
public function makeSound() {
echo "喵喵";
}
public function eat() {
echo "貓在吃食物";
}
}
使用實現類
你可以創建 Dog 和 Cat 對象,并調用它們的 makeSound() 和 eat() 方法:
phpCopy Code
$dog = new Dog();
$dog->makeSound(); // 輸出: 汪汪
$dog->eat(); // 輸出: 狗在吃食物
$cat = new Cat();
$cat->makeSound(); // 輸出: 喵喵
$cat->eat(); // 輸出: 貓在吃食物
關鍵點:
- 接口不能包含屬性,只允許定義常量和方法。
- 接口中的方法必須是公共的,且沒有方法體(即方法定義時不提供實現)。
- 一個類可以實現多個接口,通過逗號分隔接口名稱。
- 接口不能被實例化,只能通過實現接口的類來創建對象。
接口提供了一種方式來定義不同類間的共同行為,從而支持多態和靈活的代碼結構。
再來看下面這段代碼
<?php interface Animals { const CHANGLIANG = "Fox"; public function eat(); public function sleep($hours); public static function jump(); } class Cat implements Animals { public function eat() { echo "Cat 在吃飯."; } public function sleep($hours) { echo "Cat 要睡 $hours 小時."; } public static function jump() { echo '跳跳跳'; } } $cat = new Cat(); $cat->eat(); // 輸出: Cat 在吃飯. $cat->sleep(18); // 輸出: Cat 要睡 18 小時. echo Cat::CHANGLIANG; // 輸出: Fox echo Cat::jump(); // 輸出: 跳跳跳 ?>
由此可見,接口中可以聲明常量,并且在實現接口后可以直接調用接口中定義的常量。
一個類還可以實現多個接口,如下:
interface Movable { public function move(); } interface Eatable { public function eat(); } class Robot implements Movable, Eatable { public function move() { echo "機器人在移動"; } public function eat() { echo "機器人在充電"; } } $robot=new Robot; $robot->move(); $robot->eat();
回顯如下:
[Running] D:\ceshi.test\6.php"
機器人在移動機器人在充電
抽象類和抽象方法用于創建不能被實例化的類,并強制子類實現特定的方法。以下是它們的基本用法:
抽象類
抽象類不能被直接實例化,只能被繼承。它可以包含抽象方法和普通方法。子類繼承抽象類后,必須實現抽象類中的所有抽象方法
抽象方法
抽象方法沒有實現,它僅定義了方法的聲明,不需要方法體。可以使用prorected ,但不能使用privare
示例代碼
<?php
// 定義抽象類
abstract class Animal {
// 抽象方法(沒有實現)
abstract public function makeSound();
// 抽象方法(沒有實現)
abstract protected function sleep($time);
// 普通方法(有實現)
public function eat($food) {
echo "正在吃: " . $food . "<br>";
}
}
// 子類繼承抽象類并實現抽象方法
class Dog extends Animal {
public function makeSound() {
echo "汪汪汪<br>";
}
// 實現抽象方法
protected function sleep($time) {
echo "睡覺時間: " . $time . "小時<br>";
}
// 子類可以通過公共方法間接調用受保護的抽象方法
public function sleepFor($time) {
$this->sleep($time); // 調用子類實現的受保護方法
}
}
// 創建子類實例
$dog = new Dog();
$dog->makeSound(); // 輸出: 汪汪汪
$dog->eat("骨頭"); // 輸出: 正在吃: 骨頭
$dog->sleepFor(8); // 輸出: 睡覺時間: 8小時
?>
代碼解釋
-
抽象類
Animal:abstract public function makeSound();仍然是一個抽象方法,用于定義子類必須實現的功能。abstract protected function sleep($time);被定義為抽象方法,子類必須實現它,并且是受保護的(protected),意味著只能在類內或子類中訪問。public function eat($food);繼續作為一個具體的公共方法,用于處理食物。
-
子類
Dog:- 實現了
makeSound()方法。 - 實現了
sleep($time)抽象方法,并輸出睡覺時間。 - 新增了一個公共方法
sleepFor($time),它調用sleep($time),以便從類外部訪問sleep的功能。
- 實現了
-
實例化
Dog類:- 調用
makeSound()輸出 "汪汪汪"。 - 調用
eat("骨頭")輸出 "正在吃: 骨頭"。 - 調用
sleepFor(8)通過Dog類的方法調用實現的sleep(8),輸出 "睡覺時間: 8小時"。
- 調用
關鍵點
- 抽象方法
sleep($time)現在是protected,強制子類提供具體實現。 sleepFor($time)作為公共方法提供了一種方式來調用protected抽象方法。
抽象類和接口的區別
1.抽象類可以包含非抽象方法的實現,而接口只能包含方法的聲明,沒有方法的實現。
2.類只能繼承一個抽象類,但可以實現多個接口。
3.抽象類可以有構造函數,而接口不能有構造函數。
4.抽象類中的方法可以有public、protected和private訪問修飾符,而接口中的方法只能是public。
5.子類繼承抽象類時,必須實現抽象類中的所有抽象方法,否則子類也必須聲明為抽象類。
6.子類實現接口時,必須實現接口中的所有方法。
浙公網安備 33010602011771號