🐘 谈一谈PHP 编程中的 SOLID 原则

阿轩的BUG
文章191
评论56
标签101
站点日志
作者总数:1位
置顶文章:0篇
标签总数:101条
文章总数:196篇
评论总数:56条
微语总数:201条
运行天数:2317天
最近更新:2026-07-28
文章标签
最新评论
Sherlock
2025-08-21
不是应该打包成apk文件吗,怎么突然就运行编译了,下一步呢
老金er
2025-05-25
人生设计非常必要,在信息化发达的今天,周围大部分人依然只能过着人生工程模式生活,长时间生活洗礼后,尽管“人生工程”已经不再适合很多人,他们也无法做出任何改变,人生设计给我们提供了新的思路,值得尝试
赏帮赚
2025-05-25
职场太多的尔虞我诈
三笑
2024-08-16
emlog6.0.1可以升级支持吗?
pony
2024-07-08
这篇文章提供了一种新的人生规划方法——"人生设计",它借鉴了产品设计的理念,鼓励人们以创造性和探索性的方式思考和规划自己的生活。以下是对这篇文章的几个评价维度: 创新性:将产品设计的理念应用于人生规划是一个新颖的视角,为人们提供了一种跳出传统生活轨迹,探索个性化生活路径的方法。 实用性:文章不仅提出了理念,还详细介绍了具体的实施步骤,包括自我评估、制定计划、原型设计和实践选择等,具有很强的操作性。 启发性:通过强调好奇心、不断尝试、重新定义问题等心态,文章鼓励人们打破常规,勇于探索未知,这对于激发个人潜能和创造力具有积极作用。 适应性:"人生设计"理念适用于不同人生阶段和不同背景的人,无论是希望从头开始的人,还是已经取得一定成就但希望探索新方向的人,都可以从中获得启发。 情感共鸣:文章对许多人对传统生活轨迹的不满和对改变的渴望进行了深刻的洞察,能够引起读者的共鸣。 可持续性:人生设计强调的是一个持续迭代和试错的过程,这与现实生活的发展规律相吻合,有助于人们在不断变化的环境中做出适应性调整。 教育意义:作为一种人生规划方法,"人生设计"可以作为教育的一部分,帮助年轻人更早地学会自我探索和规划,为未来的生活和职业发展打下基础。 局限性:尽管"人生设计"提供了一种新的思考框架,但它可能需要个人具备一定的自我认知和反思能力,对于一些缺乏自我探索经验的人来说,可能需要额外的指导和支持。 总体来说,这篇文章提供了一种有价值的人生规划方法,对于那些渴望改变、寻求个性化生活的人来说,是一种有益的参考和指导。
首页实用干货 🌋

什么是SOLID原则

软件设计有很多原则,比如软件设计上的 SOLID principle,单元测试中的 FIRST和AAA,代码实现上的 DRY principle 等。熟悉这些原则,可以把我们的经验上升到理论高度,有利于程序员的成长,也便于团队带头人和组员控制软件质量。其中面向对象设计的 SOLID 原则是创建易于维护、扩展和测试的软件的基本指南。 SOLID 是下面几个英文词组的缩写

  1. Single-Responsibility principle (单一职责原则)
  2. Open-Close principle (开放扩展,封闭修改)
  3. Liskov substitution principle (Liskov 替换原则)
  4. Interface segregation principle (接口隔离原则)
  5. Dependency inversion principle (依赖反转原则)

在本文中,我们将提供代码示例来演示如何在 PHP 编程中应用 SOLID 原则。

单一职责原则 (SRP)

单一职责原则 (SRP) 指出一个类应该只有一个职责。 这意味着一个类应该只有一个改变的理由。 让我们看一下如何在 PHP 编程中应用 SRP 的示例。

// Example of a class with multiple responsibilities
class User {
    public function login($username, $password) {
        // Authenticate user
    }
    public function updateProfile($userId, $data) {
        // Update user profile
    }
    public function sendEmail($userId, $subject, $body) {
        // Send email to user
    }
}

// Refactored class with single responsibility
class Authenticator {
    public function login($username, $password) {
        // Authenticate user
    }
}

class ProfileUpdater {
    public function update($userId, $data) {
        // Update user profile
    }
}

class EmailSender {
    public function send($userId, $subject, $body) {
        // Send email to user
    }
}

在上面的示例中,我们从一个名为“User”的类开始,该类具有多项职责:身份验证、配置文件更新和电子邮件发送。 然后我们将该类重构为三个独立的类,每个类都有一个职责:身份验证、配置文件更新和电子邮件发送。

开闭原则(OCP)

开闭原则 (OCP) 指出软件实体应该对扩展开放,对修改关闭。 这意味着您应该能够在不修改其源代码的情况下扩展类的行为。 让我们看一下如何在 PHP 编程中应用 OCP 的示例。

// Example of a class without OCP
class Car {
    public function drive() {
        // Drive the car
    }
}

// Extended class with OCP
class CarWithNavigation extends Car {
    public function navigate() {
        // Navigate using GPS
    }
}

在上面的示例中,我们从一个名为“Car”的类开始,该类只有一个驾驶汽车的方法。 然后我们扩展该类以创建一个名为“CarWithNavigation”的新类,该类具有使用 GPS 进行导航的附加方法。 通过扩展原始类,我们能够在不修改原始类源代码的情况下添加新功能。

里氏替换原则 (LSP)

Liskov 替换原则 (LSP) 指出超类的对象应该能够被其子类的对象替换而不影响程序的正确性。 让我们看一下如何在 PHP 编程中应用 LSP 的示例。

// Example of a class that violates LSP
class Rectangle {
    public function setWidth($width) {
        $this->width = $width;
    }

    public function setHeight($height) {
        $this->height = $height;
    }

    public function getArea() {
        return $this->width * $this->height;
    }
}

class Square extends Rectangle {
    public function setWidth($width) {
        $this->width = $width;
        $this->height = $width;
    }

    public function setHeight($height) {
        $this->height = $height;
    }
}

接口隔离原则(ISP)

“I”代表面向对象设计SOLID原则中的Interface Segregation Principle(ISP)。 ISP 声明不应强迫客户端依赖于它们不使用的接口。 换句话说,拥有许多小的、特定的接口比拥有几个大的、通用的接口要好。
让我们看一个如何在 PHP 编程中应用 ISP 的示例。

// Example of a class that violates ISP
interface Document {
    public function open();
    public function save();
    public function close();
}

class TextDocument implements Document {
    public function open() {
        // Open text document
    }

    public function save() {
        // Save text document
    }

    public function close() {
        // Close text document
    }
}

class PdfDocument implements Document {
    public function open() {
        // Open PDF document
    }

    public function save() {
        // Save PDF document
    }

    public function close() {
        // Close PDF document
    }
}

在上面的示例中,我们从一个名为“Document”的接口开始,该接口具有三个方法:打开、保存和关闭。 然后我们创建了两个实现 Document 接口的类:TextDocument 和 PdfDocument。 但是,TextDocument 类不需要 close 方法,因为它只处理文本文档。 同样,PdfDocument 类不需要保存方法,因为 PDF 文档通常是只读的。 通过将 Document 接口分解为更小、更具体的接口,我们可以避免强制客户端依赖于它们不使用的方法。
要在 PHP 编程中应用 ISP,您的目标应该是创建特定于客户需求的接口。 这将使您的代码更加模块化,更易于维护,并且更不容易出错。

依赖反转原则(DIP)

D”代表面向对象设计SOLID原则中的Dependency Inversion Principle(DIP)。 DIP 指出高级模块不应该依赖于低级模块,但两者都应该依赖于抽象。 另外,抽象不应该依赖于细节,而细节应该依赖于抽象。
让我们看一下如何在 PHP 编程中应用 DIP 的示例。

// Example of a class that applies DIP
interface PaymentGateway {
    public function charge($amount);
}

class PaymentProcessor {
    private $gateway;

    public function __construct(PaymentGateway $gateway) {
        $this->gateway = $gateway;
    }

    public function processPayment($amount) {
        $this->gateway->charge($amount);
    }
}

class PaypalGateway implements PaymentGateway {
    public function charge($amount) {
        // Charge payment using Paypal API
    }
}

在更新的示例中,我们引入了 PaypalGateway 类实现的 PaymentGateway 接口。 PaymentProcessor 类现在依赖于 PaymentGateway 接口而不是 PaypalGateway 类,使其更灵活,将来更容易更改。 我们现在可以轻松地将 PaypalGateway 类换成另一个实现 PaymentGateway 接口的支付网关。
要在 PHP 编程中应用 DIP,您的目标应该是创建将高级模块与低级模块隔离开来的抽象。 这将使您的代码更加模块化,更易于维护,并且更不容易出错。

上一篇
👨‍🔬 十大JavaScript设计模式让你成为编程巨匠
下一篇
⚔️ 代码评审的18个军规