在 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.子类实现接口时,必须实现接口中的所有方法。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤