在本教程中,我们将学习如何使用PHP接口,这是PHP面向对象编程中最重要的构建块之一。
接口允许您定义一个类必须实现哪些方法。
要定义接口,可以使用interface关键字,如下所示:
<?php
interface
IMyInterface{
// 各种方法
}
接口由尚未实现的方法组成。换句话说,接口的所有方法都是抽象方法。接口可以有自己的常量。语法如下:
const
INTERFACE_CONSTANT_1 = 1;
INTERFACE_CONSTANT_2 =
'a string'
;
public
function
method_1();
method_2();
接口中的所有方法都必须是public的。
当我们要声明一个重用了现有类的属性和方法的新类时,我们说子类继承自或扩展了父类。但是对于接口,我们说一个类实现了一个接口。一个类只能从一个类继承,而一个类可以实现一个或多个接口。
要实现一个接口,可以使用implements操作符:
class
MyClass
implements
method_1(){
// 方法1的实现
method_2(){
// 方法2的实现
当一个类实现一个接口时,我们也称它为一个具体的类。具体类必须实现接口中具有相同名称和参数的所有方法。
一个类不能同时实现两个具有相同方法名称的接口,因为这样会导致调用的方法不确定。
与类类似,还可以使用extends操作符来扩展一个接口,如下所示:
IReadable{
read();
IWritable
extends
write();
IWritable接口通过添加一个write()抽象方法扩展了IReadable接口。
有几个原因:
在下面的示例中,我们将向您展示如何使用接口使系统变得更易于扩展和更灵活。
假设,我们必须创建一个可以记录消息的日志记录器。
首先,我们将创建一个名为ILogger的接口,如下所示:
ILogger{
log(
$message
);
其次,我们可以创建一个FileLogger类,它将日志消息写入日志文件。
require_once
'ilogger.php'
FileLogger
ILogger {
private
$handle
$logFile
__construct(
$filename
,
$mode
=
'a'
) {
$this
->logFile =
// 打开用于追加内容的日志文件
->handle =
fopen
(
)
or
die
'Could not open the log file'
date
"F j, Y, g:i a"
) .
': '
.
"\n"
fwrite(
->handle,
__destruct() {
if
->handle) {
fclose(
->handle);
我们可以像下面这样使用FileLogger类:
'classes/filelogger.php'
testFilelogger() {
$logger
new
FileLogger(
'./log.txt'
'w'
->log(
'开始使用文件记录器'
'另一条日志消息'
testFilelogger();
然后,我们可以添加一个数据库日志,实现ILogger接口如下:
为了演示,我们将DBLogger类写得尽可能地简化。
DBLogger
echo
sprintf(
"记录 %s 到数据库中\n"
我们可以很容易地添加实现ILogger接口的其他类型的日志记录器,而不需要修改现有的日志记录器。
下面的代码片段演示了如何同时使用多个使用了同一个ILogger接口的记录器:
testLoggers() {
$loggers
array
),
DBLogger()
foreach
as
'Log message'
testLoggers();
原文链接:https://codingdict.com/