PHP面向对象之里氏替换原则简单示例


Posted in PHP onApril 08, 2018

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

里氏替换原则(Liskov Substitution Principle)

里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

使用里氏替换原则时需要注意,子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。

通过一段代码了解

<?php
//例子1
class Bird{
  protect function fly(){
  }
}
//翠鸟
class KingFisher extends Bird{
}
//鸵鸟
class Ostrich extends Bird{
  //鸵鸟不会飞啊
}
//例子2
class A{
  protect function add($a, $b){
    return $a + $b;
  }
} 
//重载
class B extends A{
  protected function add($a, $b){
    return $a + $b + 100;
  }
}
?>

里氏替换原则是对类继承的一种约束。对里氏替换原则有两种理解:

1. 不能随便去继承不合适的,有多余方法或者属性的类。(例子1)

2. 子类可以扩展父类的功能,但不能改变父类原有的功能。(例子2)

里氏替换原则包含一下几个隐藏含义:

① 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

② 子类中可以增加自己特有的方法。

③ 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

④ 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

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

PHP 相关文章推荐
PHPLog php 程序调试追踪工具
Sep 09 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
May 04 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
Jun 25 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
ThinkPHP3.1之D方法实例详解
Jun 20 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
Sep 22 PHP
PHP中strtr字符串替换用法详解
Nov 26 PHP
laravel容器延迟加载以及auth扩展详解
Mar 02 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
Apr 08 #PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 #PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 #PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
Apr 04 #PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 #PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 #PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 #PHP
You might like
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
2019/04/23 jQuery
vue封装swiper代码实例解析
2019/10/08 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
python将时分秒转换成秒的实例
2019/12/07 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
运动会广播稿80字
2014/01/23 职场文书
社区居务公开实施方案
2014/03/27 职场文书
对孩子的寄语
2014/04/09 职场文书
户籍证明书标准模板
2014/09/10 职场文书
单位接收函格式
2015/01/30 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
2016年情人节问候语
2015/11/11 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android