在PHP面向对象编程(OOP)中,"实现"(implements)和"扩展"(extends)是两个核心概念:
| 特性 | 继承(extends) | 接口实现(implements) | |------|--------------|---------------------| | 关系 | "是一个"关系 | "能做"关系 | | 数量限制 | 单继承 | 多实现 | | 方法实现 | 可继承具体实现 | 必须提供具体实现 | | 灵活性 | 较低(紧密耦合) | 较高(松散耦合) |
使用继承的场景:
使用接口的场景:
错误示例:
interface Logger {}
class FileLogger extends Logger {} // 错误!应该用implements
正确写法:
interface Logger {}
class FileLogger implements Logger {}
错误示例:
interface PaymentGateway {
public function charge($amount);
public function refund($amount);
}
class StripePayment implements PaymentGateway {
public function charge($amount) {
// 只实现了一个方法
}
}
解决方案:
class StripePayment implements PaymentGateway {
public function charge($amount) { /* ... */ }
public function refund($amount) { /* ... */ } // 必须实现所有方法
}
错误示例:
class A {}
class B {}
class C extends A, B {} // PHP不支持多重继承
解决方案:
class A {}
class B {}
class C extends A {}
// 使用trait或接口实现类似功能
trait BTrait { /* B的功能 */ }
class D extends A {
use BTrait;
}
// 定义接口
interface LoggerInterface {
public function log($message);
}
// 定义抽象类提供部分实现
abstract class AbstractLogger implements LoggerInterface {
protected $logLevel;
public function setLogLevel($level) {
$this->logLevel = $level;
}
// log()方法留给具体类实现
}
// 具体实现类
class FileLogger extends AbstractLogger {
public function log($message) {
file_put_contents('app.log', "[{$this->logLevel}] $message\n", FILE_APPEND);
}
}
// 另一个接口
interface NotifierInterface {
public function notify($recipient, $message);
}
// 实现多个接口的类
class EmailNotifierLogger extends AbstractLogger implements NotifierInterface {
public function log($message) {
// 实现日志记录
}
public function notify($recipient, $message) {
// 实现通知功能
}
}
通过合理使用继承和接口实现,可以构建出灵活且可维护的PHP面向对象代码结构。
没有搜到相关的文章