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通用检测函数集合
Nov 25 PHP
PHP批量生成缩略图的代码
Jul 19 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
PHP获取一段文本显示点阵宽度和高度的方法
Mar 12 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
Dec 21 PHP
PHP连接数据库实现注册页面的增删改查操作
Mar 27 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
PHP检测接口Traversable用法详解
Dec 29 PHP
浅谈PHP无限极分类原理
Mar 14 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 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
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
layui实现三级联动效果
2019/07/26 Javascript
keep-alive不能缓存多层级路由菜单问题解决
2020/03/10 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
python django集成cas验证系统
2014/07/14 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
Python3.5运算符操作实例详解
2019/04/25 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
windows支持哪个版本的python
2020/07/03 Python
法律专业推荐信范文
2013/11/29 职场文书
自我鉴定写作要点
2014/01/17 职场文书
总经理助理职责
2014/02/04 职场文书
精神文明建设标语
2014/06/16 职场文书
十佳家长事迹材料
2014/08/26 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
女方离婚起诉书
2015/05/18 职场文书
Python源码解析之List
2021/05/21 Python
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技