资讯专栏INFORMATION COLUMN

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

Lyux / 3113人阅读

摘要:设计模式中依赖倒置原则的定义是高层模块不应该依赖低层模块,二者都应该依赖其抽象抽象不应该依赖细节细节应该依赖抽象。像这样,是无法真正体现依赖倒置原则的。

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

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

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

getContent();
    }
}

class Client{
    public static function main(){
        $mother = new Mother();
        $mother->narrate(new Book());
        $mother->narrate(new Newspaper());
    }
}

Client::main();

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

class Mother{
    public function narrate(IReader $book){
        echo "妈妈开始讲故事
";
        echo $book->getContent();
    }
}

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

getContent();
    }
}

class Client{
    public static function main(){
        $mother = new Mother();
        $mother->narrate(new Book());
        $mother->narrate(new Newspaper());
    }
}

$client = new Client();
$client->main();

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

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这种弱类型语言来讲,要想真正实现依赖倒置原则,必须加上类型约束,否则实现的只是表象,并不能真正体现原则的作用。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23320.html

相关文章

  • 面向对象基本原则(2)- 里式代换原则依赖倒置原则

    摘要:四依赖倒置原则依赖倒置原则简介依赖倒置原则的英文名称是,简称。依赖倒置原则的表现其实就是面向接口编程。依赖倒置原则的优点减少类间的耦合性,提高系统的稳定性。结合里氏替换原则使用接口负责定义属性和方法,并且声明与其他对象的依赖关系。 面向对象基本原则(2)- 里式代换原则与依赖倒置原则 面向对象基本原则(1)- 单一职责原则与接口隔离原则面向对象基本原则(2)- 里式代换原则与依赖倒置原...

    liangdas 评论0 收藏0
  • 设计模式六大原则PHP

    摘要:常用的六大设计模式有单一职责原则,里氏替换原则,依赖倒转原则,接口隔离原则,迪米特法则,开闭原则。这六大原则是最虚,最抽象的,很难理解。这就是接口隔离原则。当我们遵循前面介绍的五大原则,以及使用种设计模式的目的就是遵循开闭原则。   设计模式的目的是为了更好的代码重用性,可读性,可靠性和可维护性。常用的六大设计模式有:单一职责原则(SRP),里氏替换原则(LSP),依赖倒转原则(DIP...

    bluesky 评论0 收藏0
  • Laravel中核心概念

    摘要:可以为服务提供者的方法设置类型提示。方法将在所有其他服务提供者均已注册之后调用。所有服务提供者都在配置文件中注册。可以选择推迟服务提供者的注册,直到真正需要注册绑定时,这样可以提供应用程序的性能。 本文最早发布于 Rootrl的Blog 导言 Laravel是一款先进的现代化框架,里面有一些概念非常重要。在上手Laravel之前,我认为先弄懂这些概念是很有必要的。你甚至需要重温下PHP...

    ddongjian0000 评论0 收藏0
  • 搞懂依赖注入, 用 PHP 手写简易 IOC 容器

    摘要:依赖注入控制反转的一种具体实现方法。接下来,我们使用依赖注入实现控制反转,使依赖关系倒置依赖被动传入。从单元测试的角度看,依赖注入更方便和操作,方便了测试人员写出质量更高的测试代码。 前言 好的设计会提高程序的可复用性和可维护性,也间接的提高了开发人员的生产力。今天,我们就来说一下在很多框架中都使用的依赖注入。 一些概念 要搞清楚什么是依赖注入如何依赖注入,首先我们要明确一些概念。 D...

    antz 评论0 收藏0
  • PHP面向对象设计五大原则

    摘要:面向对象设计的五大原则单一职责原则接口隔离原则开放封闭原则替换原则依赖倒置原则。主要是针对继承的设计原则,继承与派生多态是的主要特性。 面向对象设计的五大原则:单一职责原则、接口隔离原则、开放-封闭原则、替换原则、依赖倒置原则。这些原则主要是由Robert C.Martin在《敏捷软件开发——原则、方法、与实践》一书中总结出来,这五大原则也是23种设计模式的基础。 单一职责原则 Sin...

    adam1q84 评论0 收藏0

发表评论

0条评论

Lyux

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<