• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP面向对象五大原则之里氏替换原则(LSP)详解
    POST TIME:2021-10-18 05:05

    本文实例讲述了PHP面向对象五大原则之里氏替换原则(LSP)。分享给大家供大家参考,具体如下:

    替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章中提出,主要阐述有关继承的一些原则,故称里氏替换原则。

    2002年,Robert C.Martin出版了一本名为《Agile Software Development Principles Patterns and Practices》的书,在书中他把里氏替换原则最终简化成一句话:“Subtypes must be substitutable for their base types”(子类必须能够替换成它们的基类。)

    1. LSP的内容

    里氏替换原则(Liskov Substitution Principle, LSP)的定义和主要思想如下:由于面向对象编程技术中的继承在具体的编程中过于简单,在许多系统的设计和编程实现中,我们并没有认真地、理性地思考应用系统中各个类之间的继承关系是否合适,派生类是否能正确地对其基类中的某些方法进行重写等问题。因此经常出现滥用继承或者错误地进行了继承等现象,给系统的后期维护带来了不少麻烦。这就需要我们有一个设计原则来遵循,它就是替换原则。

    LSP指出:子类类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。它指导我们如何正确地进行继承和派生,并合理地重用代码。此原则认为,一个软件实体如果使用一个基类的话,那么一定适用于其子类,而且这根本不能察觉出基类对象和子类对象的区别。想一想,是不是和多态的概念比较像?

    2. LSP主要是针对继承的设计原则

    因为继承与派生是OOP的一个主要特性,能够减少代码的重复编程实现,从而实现系统中的代码复用,但是如何正确地进行继承设计和合理地应用继承机制呢?

    这就是LSP所要解决的问题:

    如何正确地进行继承方面的设计?

    最佳的继承层次如何获得?

    怎么样避免所设计的类层次陷入不符合OCP原则的状况?

    那如何遵守该设计原则呢?

    1)父类的方法都要在子类中实现或者重写,并且派生类只实现其抽象类中声明的方法,而不应当给出多余的方法定义或实现

    2)在客户端程序中只应该使用父类对象而不应当直接使用子类对象,这样可以实现运行期绑定(动态多态)。

    如果A、B两个类违反了LSP的设计,通常的做法是创建一个新的抽象类C,作为两个具体类的超类,奖A和B的共同行为移动到C中,从而解决A和B的行为不完全一致的问题。

    不过PHP对LSP的支持并不好,缺乏向上转型等概念,只能通过一些曲折的方法实现。对于这个原则,这里就不细讲了。

    下面给出一个缓存的实现接口,用抽象类做基类,遵循LSP实现其设计。

    ?php
    abstract class Cache
    {
     /**
      * 设置一个缓存变量
      * @param $key 缓存key
      * @param $value 缓存内容
      * @param int $expire 缓存时间(秒)
      * @return boolean 是否缓存成功
      */
     public abstract function set($key, $value, $expire = 60);
     /**
      * 获取一个已经缓存的
      * @param $key 缓存key
      * @return mixed 缓存内容
      */
     public abstract function get($key);
     /**
      * 删除一个已经缓存的变量
      * @param $key 缓存key
      * @return boolean 是否删除成功
      */
     public abstract function del($key);
     /**
      * 删除全部缓存变量
      * @return boolean 是否删除成功
      */
     public abstract function delAll();
     /**
      * 检测是否存在对应的缓存
      * @param $key 缓存key
      * @return boolean 是否存在
      */
     public abstract function has($key);
    }
    
    

    如果现在要求实现文件、memcache、accelerator等各种机制下的缓存,只需要继承这个抽象类并实现其抽象方法即可。

    LSP中代码的不仅仅是功能,还名手语意。试思考:白马可以代换马,而牛同样作为劳动力,可代换马否?高跟鞋也是鞋子,男人穿高跟鞋又是否能接受?

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • 举例解析Java的设计模式编程中里氏替换原则的意义
    • 详解Java设计模式编程中的里氏替换原则
    • PHP面向对象之里氏替换原则简单示例
    • 深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
    • 解析Java实现设计模式六大原则之里氏替换原则
    上一篇:PHP实现微信红包金额拆分试玩的算法示例
    下一篇:PHP面向对象五大原则之依赖倒置原则(DIP)详解
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信