PHP 接口
1. 什么是 PHP 接口?
接口允许您指定类必须实现的方法。
既然你想要一套标准的行为规范,让不同的类都能“按章办事”,那么接口就是最好的选择。接口使得以相同的方式使用许多不同的类变得容易。当多个类实现相同的接口时,这就称为多态性。
2. PHP 接口 vs. 抽象类
接口与抽象类非常相似,但存在以下显著差异:
| 特性 | 接口 (Interfaces) | 抽象类 (Abstract Classes) |
|---|---|---|
| 属性 | 不能包含属性。 | 可以包含普通属性。 |
| 方法可见性 | 所有方法必须是 public。 | 方法可以是 public 或 protected。 |
| 方法实现 | 所有方法都是抽象的(不能有花括号和代码)。 | 可以包含抽象方法和普通方法。 |
| 多重实现 | 一个类可以实现多个接口。 | 一个类只能继承一个父类。 |
3. PHP - 如何使用接口
在 PHP 中,使用 interface 关键字来定义接口。
3.1 接口语法
interface InterfaceName {
public function someMethod1();
public function someMethod2($name, $color);
public function someMethod3() : string;
}3.2 实现接口
要实现接口,类必须使用 implements 关键字。
实现接口的类必须提供接口中声明的所有方法的具体实现代码。
class ClassName implements InterfaceName {
public function someMethod1() {
// 方法的具体代码
}
// ... 其他方法实现
}4. PHP 接口示例
在下面的例子中,我们定义了一个名为 Animal 的接口。随后,Cat、Dog 和 Mouse 三个类都实现了这个接口。
这意味着无论这些动物具体是什么,它们都必须具备 makeSound() 这个行为:
代码示例:
<?php
// 接口定义
interface Animal {
public function makeSound();
}
// 类定义
class Cat implements Animal {
public function makeSound() {
echo "喵 ";
}
}
class Dog implements Animal {
public function makeSound() {
echo "汪 ";
}
}
class Mouse implements Animal {
public function makeSound() {
echo "吱 ";
}
}
// 创建动物列表
$cat = new Cat();
$dog = new Dog();
$mouse = new Mouse();
$animals = array($cat, $dog, $mouse);
// 遍历并让动物们发出声音
foreach($animals as $animal) {
$animal->makeSound();
}
?>4.1 示例解析
在上述代码中,请注意:
- 我们并不关心
$animal具体是哪种动物类。 - 我们只知道它实现了
Animal接口,因此它肯定有makeSound()方法。 - 这允许我们在不修改循环代码的情况下,随时向
$animals数组中添加新的动物类(只要它实现了接口)。
5. 接口的实战优势
使用接口最大的好处在于解耦。
当你编写一个需要调用特定方法的函数时,你可以要求参数必须符合某个接口,而不是某个具体的类。这样,无论未来你的业务逻辑如何扩展,只要新编写的类遵循了接口协议,旧有的系统代码就能完美兼容新对象。
设计建议: 如果你发现多个不相关的类需要共享相同的行为(例如“可飞行”、“可序列化”),请使用接口。如果你发现多个类共享一个通用的身份和基本逻辑(例如“老师”和“学生”都是“人”),请考虑使用抽象类。