返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中SOLID原则有哪些
  • 482
分享到

PHP中SOLID原则有哪些

2023-06-17 03:06:37 482人浏览 薄情痞子
摘要

小编给大家分享一下PHP中SOLID原则有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SOLID 是Michael Feathers推荐的便于记忆的首字母简

小编给大家分享一下PHP中SOLID原则有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

SOLID 是Michael Feathers推荐的便于记忆的首字母简写,它代表了Robert Martin命名的最重要的五个面对对象编码设计原则:

  • S: 单一职责原则 (SRP)

  • O: 开闭原则 (OCP)

  • L: 里氏替换原则 (LSP)

  • I: 接口隔离原则 (ISP)

  • D: 依赖反转原则 (DIP)

单一职责原则 Single Responsibility Principle (SRP)

"修改一个类应该只为一个理由"。人们总是易于用一堆方法塞满一个类,如同我们在飞机上只能携带一个行李箱(把所有的东西都塞到箱子里)。这样做的问题是:从概念上这样的类不是高内聚的,并且留下了很多理由去修改它。将你需要修改类的次数降低到最小很重要。这是因为,当有很多方法在类中时,修改其中一处,你很难知晓在代码库中哪些依赖的模块会被影响到。

Bad:

class UserSettings{         private $user;         public function __construct($user)     {                 $this->user = $user;     }         public function changeSettings($settings)     {                 if ($this->verifyCredentials()) {                     // ...         }     }         private function verifyCredentials()     {             // ...     } }

Good:

class UserAuth {     private $user;     public function __construct($user){             $this->user = $user; }     public function verifyCredentials(){             // ...  } } class UserSettings {     private $user;     private $auth;     public function __construct($user) {           $this->user = $user;           $this->auth = new UserAuth($user); }     public function changeSettings($settings){             if ($this->auth->verifyCredentials()) {                 // ...         }     } }

开闭原则 Open/Closed Principle (OCP)

正如Bertrand Meyer所述,"软件的实体(类, 模块,  函数,等)应该对扩展开放,对修改关闭。"这个原则是在说明应该允许用户在不改变已有代码的情况下增加新的功能。

Bad:

abstract class Adapter{     protected $name;     public function getName(){             return $this->name; } } class ajaxAdapter extends Adapter{     public function __construct(){            parent::__construct();               $this->name = 'ajaxAdapter';  } } class nodeAdapter extends Adapter{         public function __construct(){            parent::__construct();                 $this->name = 'nodeAdapter';     } }     class HttpRequester{         private $adapter;         public function __construct($adapter)     {                 $this->adapter = $adapter;     }         public function fetch($url)     {         $adapterName = $this->adapter->getName();             if ($adapterName === 'ajaxAdapter') {                     return $this->makeAjaxCall($url);         }      elseif ($adapterName === 'httpNodeAdapter') {                     return $this->makeHttpCall($url);         }     }         private function makeAjaxCall($url)     {        // request and return promise     }         private function makeHttpCall($url)     {        // request and return promise     } }

在上面的代码中,对于HttpRequester类中的fetch方法,如果我新增了一个新的xxxAdapter类并且要在fetch方法中用到的话,就需要在HttpRequester类中去修改类(如加上一个elseif  判断),而通过下面的代码,就可很好的解决这个问题。下面代码很好的说明了如何在不改变原有代码的情况下增加新功能。

Good:

interface Adapter{         public function request($url); }     class AjaxAdapter implements Adapter{         public function request($url)     {        // request and return promise     } } class NodeAdapter implements Adapter{         public function request($url)     {        // request and return promise     } }     class HttpRequester{         private $adapter;         public function __construct(Adapter $adapter)     {        $this->adapter = $adapter;     }         public function fetch($url)     {        return $this->adapter->request($url);     } }

里氏替换原则 Liskov Substitution Principle (LSP)

对这个概念***的解释是:如果你有一个父类和一个子类,在不改变原有结果正确性的前提下父类和子类可以互换。这个听起来让人有些迷惑,所以让我们来看一个经典的正方形-长方形的例子。从数学上讲,正方形是一种长方形,但是当你的模型通过继承使用了"is-a"的关系时,就不对了。

Bad:

class Rectangle{         protected $width = 0;         protected $height = 0;         public function render($area)     {        // ...     }         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 = $this->height = $width;     }         public function setHeight(height)     {        $this->width = $this->height = $height;     } } function renderLargeRectangles($rectangles){         foreach ($rectangles as $rectangle) {         $rectangle->setWidth(4);         $rectangle->setHeight(5);         $area = $rectangle->getArea(); // BAD: Will return 25 for Square. Should be 20.         $rectangle->render($area);     } }  $rectangles =  [new Rectangle(), new Rectangle(), new Square()]; renderLargeRectangles($rectangles);

Good:

abstract class Shape{         protected $width = 0;         protected $height = 0;         abstract public function getArea();         public function render($area)    {        // ...     } } class Rectangle extends Shape{         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 Shape{         private $length = 0;         public function setLength($length)     {        $this->length = $length;     }         public function getArea()     {        return pow($this->length, 2);     } } function renderLargeRectangles($rectangles){     foreach ($rectangles as $rectangle) {         if ($rectangle instanceof Square) {             $rectangle->setLength(5);         } elseif ($rectangle instanceof Rectangle) {             $rectangle->setWidth(4);             $rectangle->setHeight(5);         }          $area = $rectangle->getArea();          $rectangle->render($area);     } }  $shapes = [new Rectangle(), new Rectangle(), new Square()]; renderLargeRectangles($shapes);

接口隔离原则

接口隔离原则:"客户端不应该被强制去实现于它不需要的接口"。

有一个清晰的例子来说明示范这条原则。当一个类需要一个大量的设置项,为了方便不会要求客户端去设置大量的选项,因为在通常他们不需要所有的设置项。使设置项可选有助于我们避免产生"胖接口"

Bad:

interface Employee{         public function work();         public function eat(); } class Human implements Employee{         public function work()     {        // ....working     }         public function eat()     {        // ...... eating in lunch break     } }class Robot implements Employee{         public function work()     {        //.... working much more     }         public function eat()     {        //.... robot can't eat, but it must implement this method     } }

上面的代码中,Robot类并不需要eat()这个方法,但是实现了Emplyee接口,于是只能实现所有的方法了,这使得Robot实现了它并不需要的方法。所以在这里应该对Emplyee接口进行拆分,正确的代码如下:

Good:

interface Workable{         public function work(); } interface Feedable{         public function eat(); } interface Employee extends Feedable, Workable{ } class Human implements Employee{         public function work()     {        // ....working     }         public function eat()     {        //.... eating in lunch break     } }// robot can only work  class Robot implements Workable{         public function work()     {        // ....working     } }

依赖反转原则 Dependency Inversion Principle (DIP)

这条原则说明两个基本的要点:

  • 高阶的模块不应该依赖低阶的模块,它们都应该依赖于抽象

  • 抽象不应该依赖于实现,实现应该依赖于抽象

这条起初看起来有点晦涩难懂,但是如果你使用过php框架(例如  Symfony),你应该见过依赖注入(DI)对这个概念的实现。虽然它们不是完全相通的概念,依赖倒置原则使高阶模块与低阶模块的实现细节和创建分离。可以使用依赖注入(DI)这种方式来实现它。更多的好处是它使模块之间解耦。耦合会导致你难于重构,它是一种非常糟糕的的开发模式。

Bad:

class Employee{         public function work()     {        // ....working     } } class Robot extends Employee{         public function work()    {        //.... working much more     } } class Manager{         private $employee;        public function __construct(Employee $employee)     {        $this->employee = $employee;     }    public function manage()     {        $this->employee->work();     } }

Good:

interface Employee{     public function work(); }  class Human implements Employee{    public function work()     {        // ....working     } } class Robot implements Employee{     public function work()     {        //.... working much more     } } class Manager{     private $employee;     public function __construct(Employee $employee)     {        $this->employee = $employee;     }    public function manage()     {        $this->employee->work();     } }

别写重复代码 (DRY)

这条原则大家应该都是比较熟悉了。

尽你***的努力去避免复制代码,它是一种非常糟糕的行为,复制代码通常意味着当你需要变更一些逻辑时,你需要修改不止一处。

Bad:

function showDeveloperList($developers){     foreach ($developers as $developer) {         $expectedSalary =  $developer->calculateExpectedSalary();         $experience = $developer->getExperience();         $GitHubLink = $developer->getgithubLink();         $data = [             $expectedSalary,             $experience,             $githubLink         ];          render($data);     } } function showManagerList($managers){     foreach ($managers as $manager) {         $expectedSalary =  $manager->calculateExpectedSalary();         $experience = $manager->getExperience();         $githubLink = $manager->getGithubLink();         $data = [             $expectedSalary,             $experience,             $githubLink         ];          render($data);     } }

Good:

function showList($employees){     foreach ($employees as $employee) {         $expectedSalary =  $employee->calculateExpectedSalary();         $experience = $employee->getExperience();         $githubLink = $employee->getGithubLink();         $data = [             $expectedSalary,             $experience,             $githubLink         ];          render($data);     } }

Very good:

function showList($employees){    foreach ($employees as $employee) {         render([             $employee->calculateExpectedSalary(),             $employee->getExperience(),             $employee->getGithubLink()         ]);     } }

以上是“PHP中SOLID原则有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: PHP中SOLID原则有哪些

本文链接: https://lsjlt.com/news/286965.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP中SOLID原则有哪些
    小编给大家分享一下PHP中SOLID原则有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SOLID 是Michael Feathers推荐的便于记忆的首字母简...
    99+
    2023-06-17
  • Python 中的 SOLID 原则
    💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学...
    99+
    2023-09-11
    python 开发语言
  • react中怎么应用SOLID原则
    这篇文章主要介绍“react中怎么应用SOLID原则”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react中怎么应用SOLID原则”文章能帮助大家解决问题。什么是开闭原则?Robert c. Ma...
    99+
    2023-07-02
  • 在React中怎么应用SOLID原则
    本篇内容介绍了“在React中怎么应用SOLID原则”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、单一职责原则(SRP)单一职责原则的定...
    99+
    2023-07-02
  • Python中的SOLID原则实例详解
    目录前言单一职责原则开闭原则里氏替换原则接口隔离原则依赖倒置原则如何发现它?结论前言 SOLID 是一组面向对象的设计原则,旨在使代码更易于维护和灵活。它们是由 Robert &ld...
    99+
    2023-02-15
    python solid原则 面向对象的solid
  • 在React中应用SOLID原则的方法
    目录1、单一职责原则(SRP)2、开放封闭原则(OCP)3、里氏替换原则(LSP)4、接口隔离原则(ISP)5、依赖倒置原则(DIP)6、小结在面向对象编程(OOP)中,SOLID ...
    99+
    2024-04-02
  • JavaScript中原型有哪些规则
    今天就跟大家聊聊有关JavaScript中原型有哪些规则,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。javascript是一种什么语言javascript是一种动态类型、弱类型的语...
    99+
    2023-06-14
  • Java中有哪些设计原则
    本篇文章给大家分享的是有关Java中有哪些设计原则,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、单一职责原则(SingleResponsibilityPrinciple,S...
    99+
    2023-06-15
  • php设计模式的原则有哪些
    PHP设计模式的原则包括以下几个:1. 单一职责原则(Single Responsibility Principle,SRP):一个...
    99+
    2023-08-14
    php
  • PHP中构造函数的使用原则有哪些
    PHP中构造函数的使用原则有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。构造函数是PHP中总要的基本语法,什么是构造函数呢?我们这里就一起来看看PHP构造函数。如果你...
    99+
    2023-06-17
  • 如何应用 SOLID 原则在 React 中整理代码之开闭原则
    目录本系列其他文章什么是开闭原则?让我们从一个例子开始一个糟糕的解决方案解决方案是什么?让我们创建单独的用户组件注意总结 SOLID 是一套原则。它们主要是关心代码质量和可维护性的软...
    99+
    2024-04-02
  • JavaScript中API设计原则有哪些
    本篇文章为大家展示了JavaScript中API设计原则有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、接口的流畅性好的接口是流畅易懂的,他主要体现如下几个...
    99+
    2024-04-02
  • mysql中常见的原则有哪些
    mysql中常见的原则有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、最左匹配原则例如,如果你建立了一个(a,b)索引,就没有必要再建立一个a索引,因为...
    99+
    2023-06-25
  • SQL优化原则有哪些
    这篇文章将为大家详细讲解有关SQL优化原则有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL...
    99+
    2024-04-02
  • SEO优化原则有哪些
    这篇文章给大家分享的是有关SEO优化原则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  1. 关键词优化  1)关键词选择策略:两高一低: 高搜索量, 与页面内容高相关, SEO竞争低。选择搜索量高的词也...
    99+
    2023-06-09
  • Dashboard的实现原则有哪些
    这篇文章主要讲解了“Dashboard的实现原则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Dashboard的实现原则有哪些”吧!1. 反复试验,...
    99+
    2024-04-02
  • 域名注册原则有哪些
    域名注册原则有:1.字符最低不能少于1个,最多不能超出20个;2.只提供英文字母、数字以及“-”等字符注册;3.不能使用空格及特殊字符;4.“-”不能用作开头和结尾;5.不得注册对国家、社会或者公共利益有损害的名称。域名注册原则有:1.字符...
    99+
    2024-04-02
  • java重构的原则有哪些
    Java重构的原则包括:1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有...
    99+
    2023-08-30
    java
  • rest api设计原则有哪些
    遵循HTTP协议:REST API应该遵循HTTP协议的规范,使用HTTP方法(GET、POST、PUT、DELETE)来操作资源,...
    99+
    2023-10-19
    restapi
  • Design Pattern设计原则有哪些
    这篇文章给大家分享的是有关Design Pattern设计原则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Design Pattern 笔记过于僵硬:不能轻松的加入新的功能过于脆弱:修改一处可能波及到很多...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作