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加密解密的代码
Oct 09 PHP
php xml文件操作实现代码(二)
Mar 20 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
PHP模块memcached使用指南
Dec 08 PHP
php使用PDO操作MySQL数据库实例
Dec 30 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
Feb 02 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 PHP
PHP simplexml_import_dom()函数讲解
Feb 03 PHP
PHP函数积累总结
Mar 19 PHP
php实现网页上一页下一页翻页过程详解
Jun 28 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 ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
浅谈angular.js跨域post解决方案
2017/08/30 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
解决Django中多条件查询的问题
2019/07/18 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
python实现学生通讯录管理系统
2021/02/25 Python
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
一份软件工程师的面试试题
2016/02/01 面试题
生日寄语大全
2014/04/08 职场文书
2014年监理工作总结范文
2014/11/17 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
心灵捕手观后感
2015/06/02 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
python简单验证码识别的实现过程
2021/06/20 Python