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 相关文章推荐
php预定义常量
Dec 25 PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 PHP
php的array_multisort()使用方法介绍
May 16 PHP
eAccelerator的安装与使用详解
Jun 13 PHP
解析zend Framework如何自动加载类
Jun 28 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
php中的常用魔术方法总结
Aug 02 PHP
PHP数组游标实现对数组的各种操作详解
Jan 26 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 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
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
JSONP 跨域共享信息
2012/08/16 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
python抓取京东商城手机列表url实例代码
2013/12/18 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
python中bytes和str类型的区别
2019/10/21 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
世界最大的票务市场:viagogo
2017/02/16 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
社会工作专业求职信
2014/07/15 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang