位置: 编程技术 - 正文

PHP面向对象编程之深入理解方法重载与方法覆盖(多态)(php面向对象编程学生类)

编辑:rootadmin

推荐整理分享PHP面向对象编程之深入理解方法重载与方法覆盖(多态)(php面向对象编程学生类),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php面向对象编程实验报告,php面向对象编程实验报告,php面向对象编程实验报告,php面向对象编程的三大要素,php面向对象编程的三大要素,php面向对象编程number,php面向对象编程实验报告,php面向对象编程学生类,内容如对您有帮助,希望把文章链接给更多的朋友!

什么是多态?

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针(没错这段话来自百度百科)。那么多态的作用是什么,它有什么实际开发价值呢?在实际的应用开发中,采用面向对象中的多态主要在于可以将不同的子类对象都当作一个父类来处理,并且可以屏蔽不同子类对象之间所存在的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

下面就是PHP中多态的两个实现

方法重载(overload)

重载是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。即当调用的时候,虽然方法名字相同,但根据参数的不同可以自动调用相应的函数。

假如php直接支持方法重载的话。那么上面的例子执行后传参和不传参就会返回不同的值。然而php并不直接支持重载,这就意味着你如果直接按上面这样定义的话,就会报错的。会报什么错呢?会报如下的错误。

这意思就是不能重复定义A函数,报错的行数也正是下面这行。

所以说php是并不直接支持重载的。合着说了这么半天php并不支持。。别急,我说的是并不直接支持,所以说是我们可以让php间接支持。这时候就要用到一个函数来支持重载了。就是__call()。__call()方法必须带有两个参数。第一个包含了被调用的方法名称,而第二个参数包含了传递给该方法的参数数组。可以通过这个方法实现类似于函数重载的功能。看下面的代码。

定义方法的时候,可以看到有三个分支,如果一个对象传递给display()方法,就调用的是displayObject()方法;如果传递的是一个数组,调用displayArray();传递的是其他的内容的话,则调用的是displayScalar()方法。。。可以看到下面调用时,第一个是传递了一个数组,则调用displayArray()。第二个传入的不是对象也不是数组,则属于其他内容,调用的是displayScalar()方法。所以这样子就用__call()方法实现了类似于其他语言的方法重载。

方法覆盖(override)

所谓覆盖,从本质上来说就是重写。就是当子类继承父类的一些方法后,子类又在其内部定义了相同的方法,则这个新定义的方法会覆盖继承而来的父类的方法,子类只能调用其内部定义的方法。

有以下几点要求:

1.当一个父类和子类有一个方法,参数和名字完全一致,那么子类方法会覆盖父类的方法。

2.在实行方法覆盖的时候,访问修饰符可以是不一样的,但是子类的访问范围必须大于等于父类的访问范围。

3.要求参数和名字一样。并不是要求子类,父类名称相同。

下面是对这几点的解释:

PHP面向对象编程之深入理解方法重载与方法覆盖(多态)(php面向对象编程学生类)

第一点,必须参数一致,才会实现方法覆盖。当参数个数不一致,则会报错(这就牵扯到上面说所得方法重载)。当方法名字不一致,就不会覆盖,只是子类新定义的方法。;

第二点,这是php这些语言设计时的规定吧。我是这么理解的是访问高一层的东西比较容易,如果再去访问底层的东西权限肯定要高一些。

看代码:

这样很正常的可以输出“女人唱歌”。但当把woman里的sing()方法改为proctcted,父元素改成public()时,即将父类的访问权限设置的大于子类后,就会报下面的错误。

第三点,是要求参数和名字一样,具体就是要求参数的个数与父类相同,而并不是参数名称一致。即传递的参数名字可以为任意,只要保证传递的个数相同即可。

以上内容简单介绍了PHP语言中多态的两个实现。

PS:重写、覆盖、重载、多态几个概念的区别分析

override->重写(=覆盖)、overload->重载、polymorphism -> 多态

override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。重写(覆盖)的规则:

1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。 3、重写的方法的返回值必须和被重写的方法的返回一致; 4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类; 5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。 6、静态方法不能被重写为非静态的方法(会编译出错)。

overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。

重载的规则:

1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样); 2、不能通过访问权限、返回类型、抛出的异常进行重载; 3、方法的异常类型和数目不会对重载造成影响;

多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。

一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。

举个例子:

注意Triangle类的方法是重写,而Rectangle类的方法是重载。对两者比较,可以发现多态对重载的优点:

如果用重载,则在父类里要对应每一个子类都重载一个取得边数的方法;

如果用多态,则父类只提供取得边数的接口,至于取得哪个形状的边数,怎样取得,在子类里各自实现(重写)。

深入浅析php json 格式控制 关于json这个问题,陆陆续续有新手朋友找我问,比如为什么我输出的是{"1":"item1","2":"item2","3":"item3"}而不是["item1","item2","item3"]。php数组与js数组我这里用

纯PHP代码实现支付宝批量付款 最近在做一个使用支付宝转账的项目,其中有需求把我难到了:批量支付成功后不知道怎么接收系统返回的通知,经过朋友帮忙,此功能实现,下面小

在Mac OS上自行编译安装Apache服务器和PHP解释器 Apache2.2.和PHP5.5.在MacOSX.8.5编译安装过程:在开始之前首先升级Xcode的组件:preferences=Downloads=下载CommandLineTools包然后进入Apache的源码包,对于大部分

标签: php面向对象编程学生类

本文链接地址:https://www.jiuchutong.com/biancheng/284279.html 转载请保留说明!

上一篇:php获取英文姓名首字母的方法(php输出姓名)

下一篇:深入浅析php json 格式控制(php操作json)

  • 印花税购销合同减半征收政策
  • 季初资产总额是1,季末是0怎么填
  • 医药零售行业 利润构成
  • 高新技术企业职工人数如何确定
  • 工程造价咨询服务流程
  • 生产型企业付的消防年检费记什么科目
  • 财产租赁合同印花税计税依据含税吗
  • 无形资产除了专利还有什么
  • 固定资产盘盈怎么算
  • 缴纳印花税需要计提吗?
  • 特许权使用费如何确认收入
  • 宣传资料设计制作
  • 金税盘费用如何抵扣
  • 非流动资产基金是什么意思
  • 收到不开票的返利如何记账?
  • 普票没有税号可以开票吗
  • 个体工商户交企业所得
  • 单位代缴纳职工个税如何账务处理
  • 收到存款利息收入
  • 短期借款有没有上年结转
  • win10用户头像错误 设置用户头像失败,请再试一次
  • win11任务栏无法居中
  • mac的分辨率怎么调
  • mac电脑新手使用
  • 债转股适用范围
  • 收到银行承兑汇票的账务处理
  • win7安装高版本chrome
  • 以下关于static
  • 缴纳租房押金会被骗吗
  • 跨年费用入账
  • 商场代收款发票图片
  • 第三方代付如何开票
  • 应付职工薪酬多栏式
  • vue实现回车登录
  • 去哪儿网发票能不能不开旅游
  • 开个人劳务发票怎么缴个人所得税
  • 劳务费发票为什么必须每月开
  • 金蝶系统结账之后反结账
  • 外勤会计是做什么的
  • 联营企业与合营企业纳入合并吗
  • 发票认证注意事项及细节
  • php出现错误代码怎么办
  • 公允价值变动是一级科目吗
  • 应收账款账龄计提坏账比例
  • 在软件中的操作有哪些
  • 房屋提折旧几年
  • 房租预付款会计分录
  • 付款金额与收到款的关系
  • 购买土地需要缴纳哪些费用
  • 业务招待费的进项能抵扣吗
  • 增值税免抵退税和免退税的区别有什么?
  • 企业办公楼房产税如何征收
  • 专项资金补助经费如何入账
  • 营业外支出的用法
  • 核定征收需要什么资料
  • 3%税率专票为什么不能抵扣
  • 营业收入和营业总收入一样吗
  • 利润表持续经营净利润怎么算
  • 固定资产一次性扣除账务处理
  • mac中怎么给表情添加文字
  • win10 没有用户
  • hdaudpropshortcut.exe是什么进程 作用是什么 hdaudpropshortcut进程查询
  • application error message 漏洞验证
  • centos6.8升级centos7
  • hyper安装win7
  • win10系统创建一个快捷bat
  • 深入理解新发展理念,推进供给侧结构性改革 心得体会
  • android实战项目
  • 一个简单的小实验
  • linux用户配置文件是什么
  • opengl自学
  • bootstrap弹出表单
  • jQuery继承extend用法详解
  • 点评js异步加载什么意思
  • time模块 python
  • 河南省医保网上报销流程
  • 怎么屏蔽微信群消息,但是不退出此群
  • 电子税务局年度申报流程
  • 生产税净额包含企业所得税吗
  • 以划拨方式取得土地使用权的,转让房地产时
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设