在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;
}
}
?>
在这个示例中,Rectangle
和 Circle
类都实现了 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
类实现了 Drawable
和 Colorable
两个接口,必须实现这两个接口的所有方法。
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
接口的对象作为参数,确保在调用时传递的对象符合接口的要求。
总结
- 接口定义: 使用
interface
关键字定义接口,方法不包含实现。 - 接口实现: 类使用
implements
关键字实现接口,并提供方法的具体实现。 - 多个接口: 一个类可以实现多个接口。
- 接口继承: 接口可以继承其他接口,支持接口的层级关系。
- 类型提示: 接口可以用于函数参数和返回值的类型提示,确保传递对象符合接口规范。
关键字
PHP
, 接口
, interface
, implements
, 多重实现
, 接口继承
, 类型提示
, 方法签名
, 实现类