PHP 简明教程

PHP 接口

1. 什么是 PHP 接口?

接口允许您指定类必须实现的方法。

既然你想要一套标准的行为规范,让不同的类都能“按章办事”,那么接口就是最好的选择。接口使得以相同的方式使用许多不同的类变得容易。当多个类实现相同的接口时,这就称为多态性

2. PHP 接口 vs. 抽象类

接口与抽象类非常相似,但存在以下显著差异:

特性接口 (Interfaces)抽象类 (Abstract Classes)
属性不能包含属性。可以包含普通属性。
方法可见性所有方法必须是 public方法可以是 publicprotected
方法实现所有方法都是抽象的(不能有花括号和代码)。可以包含抽象方法和普通方法。
多重实现一个类可以实现多个接口。一个类只能继承一个父类。

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 的接口。随后,CatDogMouse 三个类都实现了这个接口。

这意味着无论这些动物具体是什么,它们都必须具备 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 示例解析

在上述代码中,请注意:

  1. 我们并不关心 $animal 具体是哪种动物类。
  2. 我们只知道它实现了 Animal 接口,因此它肯定有 makeSound() 方法。
  3. 这允许我们在不修改循环代码的情况下,随时向 $animals 数组中添加新的动物类(只要它实现了接口)。

5. 接口的实战优势

使用接口最大的好处在于解耦

当你编写一个需要调用特定方法的函数时,你可以要求参数必须符合某个接口,而不是某个具体的类。这样,无论未来你的业务逻辑如何扩展,只要新编写的类遵循了接口协议,旧有的系统代码就能完美兼容新对象。

设计建议: 如果你发现多个不相关的类需要共享相同的行为(例如“可飞行”、“可序列化”),请使用接口。如果你发现多个类共享一个通用的身份和基本逻辑(例如“老师”和“学生”都是“人”),请考虑使用抽象类。