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与ASP
Oct 09 PHP
php代码把全角数字转为半角数字
Dec 10 PHP
php skymvc 一款轻量、简单的php
Jun 28 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
php面向对象中的魔术方法中文说明
Mar 04 PHP
php邮件发送的两种方式
Apr 28 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
php实现转换html格式为文本格式的方法
May 16 PHP
thinkphp分页集成实例
Jul 24 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
Sep 15 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
PHP让网站移动访问更加友好方法
Feb 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
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
PHP 图片水印类代码
2012/08/27 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
js function使用心得
2010/05/10 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
JS实现的冒泡排序,快速排序,插入排序算法示例
2019/03/02 Javascript
利用python获得时间的实例说明
2013/03/25 Python
python使用urllib模块开发的多线程豆瓣小站mp3下载器
2014/01/16 Python
详解Python验证码识别
2016/01/25 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
请用用Java代码写一个堆栈
2012/01/26 面试题
学习之星事迹材料
2014/05/17 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
解除租房协议书
2014/12/03 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
JavaScript设计模式之原型模式详情
2022/06/21 Javascript