完整的 PHP 依赖倒置原则例程

2024-04-25 16:32

本文主要是介绍完整的 PHP 依赖倒置原则例程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设计模式中依赖倒置原则( DependenceInversionPrinciple)的定义是“高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。”理解起来并不难,但在具体实现上,网上给出的很多 PHP示例都有缺陷。

就拿这篇文章来说,概念讲的没有问题,但在具体实现上,特别是代码中有很多错误,不能体现 PHP特色,比如 PHP中应该用 ->而不是用 .来调用方法,变量名应该带 $等很多错误,这就不说了,最关键的是即使把这些语法错误都改正,例子也不能说明原则,不够有说服力。因为即使不加接口或抽象类,妈妈也一样能给孩子讲故事、读报纸、读杂志。

以下可运行代码,没有用到任何接口和抽象类,一样可以实现功能,并且可扩展,不需要修改 Mother类里的任何代码,一样可以轻松自如地让妈妈读各种读物,无非就是在上面追加各种 class,只要这个 class里有 getContent方法,妈妈全部可以识别:

  
  1. <?php

  2. class Book {

  3.    public function getContent(){

  4.        return "很久很久以前有一个阿拉伯的故事……\n";

  5.    }

  6. }

  7. class Newspaper {

  8.    public function getContent(){

  9.        return "林书豪17+9助尼克斯击败老鹰……\n";

  10.    }

  11. }

  12. class Mother{

  13.    public function narrate($book){

  14.        echo "妈妈开始讲故事\n";

  15.        echo $book->getContent();

  16.    }

  17. }

  18. class Client{

  19.    public static function main(){

  20.        $mother = new Mother();

  21.        $mother->narrate(new Book());

  22.        $mother->narrate(new Newspaper());

  23.    }

  24. }

  25. Client::main();

既然如此随意,还如何体现依赖倒置呢?这是因为 PHP弱类型语言,特点就是不需要为变量指定类型,导致的结果就是只要你的 class里有我需要调用的方法(在这里是 getContent方法),那就无论如何也不会出错,至于你是不是实现了什么 interface接口,都无所谓的。像这样,是无法真正体现依赖倒置原则的。那到底如何才能真正体现依赖倒置呢?秘诀就是我们通过使用PHP的类型约束来规定 narrate函数的 $book参数必须是一个接口:

  
  1. class Mother{

  2.    public function narrate(IReader $book){

  3.        echo "妈妈开始讲故事\n";

  4.        echo $book->getContent();

  5.    }

  6. }

在这里,我们规定了 $book参数必须是一个 IReader接口,那么凡是需要让妈妈讲的读物都必须是对于 IReader这个接口的一个实现,否则就会报错。完整代码如下:

  
  1. <?php

  2. interface IReader{

  3.    public function getContent();

  4. }

  5. class Book implements IReader {

  6.    public function getContent(){

  7.        return "很久很久以前有一个阿拉伯的故事……\n";

  8.    }

  9. }

  10. class Newspaper implements IReader {

  11.    public function getContent(){

  12.        return "林书豪17+9助尼克斯击败老鹰……\n";

  13.    }

  14. }

  15. class Mother{

  16.    public function narrate(IReader $book){

  17.        echo "妈妈开始讲故事\n";

  18.        echo $book->getContent();

  19.    }

  20. }

  21. class Client{

  22.    public static function main(){

  23.        $mother = new Mother();

  24.        $mother->narrate(new Book());

  25.        $mother->narrate(new Newspaper());

  26.    }

  27. }

  28. $client = new Client();

  29. $client->main();

你可以试着把 classNewspaper后面的 implementsIReader去掉然后运行一下,马上就会报错:

  
  1. PHP Fatal error:  Uncaught TypeError: Argument 1 passed to Mother::narrate() must implement interface IReader, instance of Newspaper given, called in /Users/zhangjing/Projects/phpdesignpattern/client.php on line 29 and defined in /Users/zhangjing/Projects/phpdesignpattern/client.php:19

所以结论是:对于PHP这种弱类型语言来讲,要想真正实现依赖倒置原则,必须加上类型约束,否则实现的只是表象,并不能真正体现原则的作用。


这篇关于完整的 PHP 依赖倒置原则例程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935207

相关文章

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

MySQL中慢SQL优化方法的完整指南

《MySQL中慢SQL优化方法的完整指南》当数据库响应时间超过500ms时,系统将面临三大灾难链式反应,所以本文将为大家介绍一下MySQL中慢SQL优化的常用方法,有需要的小伙伴可以了解下... 目录一、慢SQL的致命影响二、精准定位问题SQL1. 启用慢查询日志2. 诊断黄金三件套三、六大核心优化方案方案

Java使用Mail构建邮件功能的完整指南

《Java使用Mail构建邮件功能的完整指南》JavaMailAPI是一个功能强大的工具,它可以帮助开发者轻松实现邮件的发送与接收功能,本文将介绍如何使用JavaMail发送和接收邮件,希望对大家有所... 目录1、简述2、主要特点3、发送样例3.1 发送纯文本邮件3.2 发送 html 邮件3.3 发送带

一文详解kafka开启kerberos认证的完整步骤

《一文详解kafka开启kerberos认证的完整步骤》这篇文章主要为大家详细介绍了kafka开启kerberos认证的完整步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、kerberos安装部署二、准备机器三、Kerberos Server 安装1、配置krb5.con

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Windows环境下安装达梦数据库的完整步骤

《Windows环境下安装达梦数据库的完整步骤》达梦数据库的安装大致分为Windows和Linux版本,本文将以dm8企业版Windows_64位环境为例,为大家介绍一下达梦数据库的具体安装步骤吧... 目录环境介绍1 下载解压安装包2 根据安装手册安装2.1 选择语言 时区2.2 安装向导2.3 接受协议

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

IDEA与JDK、Maven安装配置完整步骤解析

《IDEA与JDK、Maven安装配置完整步骤解析》:本文主要介绍如何安装和配置IDE(IntelliJIDEA),包括IDE的安装步骤、JDK的下载与配置、Maven的安装与配置,以及如何在I... 目录1. IDE安装步骤2.配置操作步骤3. JDK配置下载JDK配置JDK环境变量4. Maven配置下

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并