在PHP中如何定义和实现接口?

在 PHP 中,接口(Interface)是一种定义方法而不实现方法的机制,它定义了一组方法的签名,这些方法必须在实现接口的类中被定义。接口可以用于实现多态,保证不同类可以通过相同的方法进行操作。以下是详细的定义和实现 PHP 接口的步骤。

1. 定义接口

接口使用 interface 关键字定义。接口中的方法没有实现(即没有方法体),只定义方法的签名。接口中的方法默认是公共的 (public),且不能有属性。

接口定义示例

php
<?php // 定义一个接口 interface Shape { public function getArea(); public function getPerimeter(); } ?>

在这个示例中,Shape 接口定义了两个方法 getArea()getPerimeter(),这些方法必须在实现这个接口的类中实现。

2. 实现接口

实现接口的类使用 implements 关键字,并且必须实现接口中定义的所有方法。一个类可以实现多个接口,接口之间用逗号分隔。

实现接口的示例

php
<?php // 实现 Shape 接口的类 class Rectangle implements Shape { private $width; private $height; public function __construct($width, $height) { $this->width = $width; $this->height = $height; } // 实现接口的方法 public function getArea() { return $this->width * $this->height; } public function getPerimeter() { return 2 * ($this->width + $this->height); } } // 实现 Shape 接口的另一个类 class Circle implements Shape { private $radius; public function __construct($radius) { $this->radius = $radius; } // 实现接口的方法 public function getArea() { return pi() * $this->radius * $this->radius; } public function getPerimeter() { return 2 * pi() * $this->radius; } } ?>

在这个示例中,RectangleCircle 类都实现了 Shape 接口,提供了 getArea()getPerimeter() 方法的具体实现。

3. 接口的多重实现

一个类可以实现多个接口,每个接口的方法都必须在类中实现。

多个接口示例

php
<?php // 定义第一个接口 interface Drawable { public function draw(); } // 定义第二个接口 interface Colorable { public function setColor($color); } // 实现两个接口的类 class ColoredRectangle implements Drawable, Colorable { private $width; private $height; private $color; public function __construct($width, $height, $color) { $this->width = $width; $this->height = $height; $this->color = $color; } // 实现 Drawable 接口的方法 public function draw() { echo "Drawing a " . $this->color . " rectangle of width " . $this->width . " and height " . $this->height . ".\n"; } // 实现 Colorable 接口的方法 public function setColor($color) { $this->color = $color; } } ?>

在这个示例中,ColoredRectangle 类实现了 DrawableColorable 两个接口,必须实现这两个接口的所有方法。

4. 接口的继承

接口可以继承其他接口。这允许接口之间有层级关系,子接口继承了父接口的方法。

接口继承示例

php
<?php // 定义父接口 interface Printable { public function print(); } // 定义子接口 interface Reportable extends Printable { public function generateReport(); } // 实现子接口的类 class Report implements Reportable { public function print() { echo "Printing report...\n"; } public function generateReport() { echo "Generating report...\n"; } } ?>

在这个示例中,Reportable 继承了 Printable 接口,Report 类实现了 Reportable 接口,必须实现所有继承的和自身的接口方法。

5. 接口的类型提示

接口可以用作函数参数和返回类型的类型提示,确保传递给函数的对象符合接口的规范。

接口类型提示示例

php
<?php // 定义接口 interface Logger { public function log($message); } // 实现接口的类 class FileLogger implements Logger { public function log($message) { echo "Logging to file: $message\n"; } } // 函数接受 Logger 接口类型的参数 function writeLog(Logger $logger, $message) { $logger->log($message); } $logger = new FileLogger(); writeLog($logger, "This is a log message."); ?>

在这个示例中,writeLog 函数接受一个实现了 Logger 接口的对象作为参数,确保在调用时传递的对象符合接口的要求。

总结

  1. 接口定义: 使用 interface 关键字定义接口,方法不包含实现。
  2. 接口实现: 类使用 implements 关键字实现接口,并提供方法的具体实现。
  3. 多个接口: 一个类可以实现多个接口。
  4. 接口继承: 接口可以继承其他接口,支持接口的层级关系。
  5. 类型提示: 接口可以用于函数参数和返回值的类型提示,确保传递对象符合接口规范。

关键字

PHP, 接口, interface, implements, 多重实现, 接口继承, 类型提示, 方法签名, 实现类