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 相关文章推荐
zend framework多模块多布局配置
Feb 26 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
Jun 23 PHP
PHP sprintf() 函数的应用(定义和用法)
Jun 29 PHP
浅谈php函数serialize()与unserialize()的使用方法
Aug 19 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
PHP结合Ueditor并修改图片上传路径
Oct 16 PHP
php 生成签名及验证签名详解
Oct 26 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 PHP
laravel邮件发送的实现代码示例
Jan 31 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
mysql数据库差异比较的PHP代码
2012/02/05 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
Angularjs 基础入门
2014/12/26 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
十分钟教你上手ES2020新特性
2020/02/12 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
python使用socket连接远程服务器的方法
2015/04/29 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
python模糊图片过滤的方法
2018/12/14 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
python中setuptools的作用是什么
2020/06/19 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
介绍一下#error预处理
2015/09/25 面试题
介绍一下linux的文件系统
2015/10/06 面试题
大专自我鉴定范文
2013/10/23 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
公司合并协议书范本
2014/09/30 职场文书
公务员检讨书
2014/11/01 职场文书
校园运动会广播稿
2015/08/19 职场文书
校运会班级霸气口号
2015/12/24 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
工厂无线对讲系统解决方案
2022/02/18 无线电