PHP中的SOLID原则:理论与实践,打造整洁代码

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

SOLID原则在PHP中的理论与实践



SOLID是罗伯特·马丁(Uncle Bob)提出的面向对象编程五大基本原则的首字母缩写。这些原则有助于创建灵活、可维护且可扩展的代码。本文将使用PHP示例分析每个原则,并展示如何在真实项目中应用它们。



1. 单一职责原则(SRP)



核心思想:每个类应该只有一个引起变化的原因。换句话说,一个类只应负责一项任务。



违反SRP的示例:

class Order {    public function calculateTotal() { /* ... */ }    public function saveToDatabase() { /* ... */ }    public function sendEmailNotification() { /* ... */ }}


这里的Order类同时负责计算、保存和发送通知,违反了SRP。



解决方案:

class Order {    public function calculateTotal() { /* ... */ }}

class OrderRepository { public function save(Order $order) { /* ... */ }}

class EmailNotificationService { public function sendOrderConfirmation(Order $order) { /* ... */ }}


现在每个类都有明确的单一职责,简化了测试和修改。



2. 开闭原则(OCP)



核心思想:类应该对扩展开放,对修改关闭。应该能够在不修改现有代码的情况下添加新功能。



违反OCP的示例:

class PaymentProcessor {    public function process($type) {        if ($type == 'credit_card') {            // 信用卡处理        } elseif ($type == 'paypal') {            // PayPal处理        }    }}


要添加新的支付方式,必须修改PaymentProcessor类。



使用接口的解决方案:

interface PaymentMethod {    public function process();}

class CreditCardPayment implements PaymentMethod { public function process() { /* ... */ }}

class PayPalPayment implements PaymentMethod { public function process() { /* ... */ }}

class PaymentProcessor { public function process(PaymentMethod $method) { $method->process(); }}


现在要添加新的支付方式,只需创建实现PaymentMethod接口的新类,无需修改现有代码。



3. 里氏替换原则(LSP)



核心思想:子类对象应该可以替换基类对象而不影响程序正确性。子类不应改变基类预期的行为。



违反LSP的示例:

class Rectangle {    protected $width;    protected $height;

public function setWidth($w) { $this->width = $w; } public function setHeight($h) { $this->height = $h; } public function getArea() { return $this->width * $this->height; }}

class Square extends Rectangle { public function setWidth($w) { $this->width = $w; $this->height = $w; // 违反原则 } public function setHeight($h) { $this->height = $h; $this->width = $h; // 违反原则 }}


如果客户端代码期望改变宽度不会影响高度,那么Square会破坏这个期望。



解决方案:如果子类不完全符合父类的行为,应避免继承。最好使用组合或独立的类:

interface Shape                

博客

书籍推荐