PHP面向对象编程——深入理解方法重载与方法覆盖(多态),多态覆盖
什么是多态?
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针(没错这段话来自百度百科)。那么多态的作用是什么,它有什么实际开发价值呢?在实际的应用开发中,采用面向对象中的多态主要在于可以将不同的子类对象都当作一个父类来处理,并且可以屏蔽不同子类对象之间所存在的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
下面就是PHP中多态的两个实现
方法重载(overload)
重载是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。即当调用的时候,虽然方法名字相同,但根据参数的不同可以自动调用相应的函数。
class A{ public function test(){ echo "test1"; } public function test($a){ echo "test2"; } } $a=new A(); $a->test(); $a->test($a);
假如php直接支持方法重载的话。那么上面的例子执行后传参和不传参就会返回不同的值。然而php并不直接支持重载,这就意味着你如果直接按上面这样定义的话,就会报错的。会报什么错呢?会报如下的错误。
这意思就是不能重复定义A函数,报错的行数也正是下面这行。
public function test($a){
所以说php是并不直接支持重载的。合着说了这么半天php并不支持。。别急,我说的是并不直接支持,所以说是我们可以让php间接支持。这时候就要用到一个函数来支持重载了。就是__call()。__call()方法必须带有两个参数。第一个包含了被调用的方法名称,而第二个参数包含了传递给该方法的参数数组。可以通过这个方法实现类似于函数重载的功能。看下面的代码。
public function __call($method,$p<span>) { if($method=="display"<span>){ if(is_object($p[0<span>])){ $this->displayObject($p[0<span>]); }else if(is_array($p[0<span>])){ $this->displayArray($p[0<span>]); }else<span>{ $this->displayScalar($p[0<span>]); } } }<br /> //下面是对上面定义的调用 $ov=new<span> overload; $ov->display(array(1,2,3<span>)); $ov->display('cat');</span></span></span></span></span></span></span></span></span></span>
定义方法的时候,可以看到有三个分支,如果一个对象传递给display()方法,就调用的是displayObject()方法;如果传递的是一个数组,调用displayArray();传递的是其他的内容的话,则调用的是displayScalar()方法。。。可以看到下面调用时,第一个是传递了一个数组,则调用displayArray()。第二个传入的不是对象也不是数组,则属于其他内容,调用的是displayScalar()方法。所以这样子就用__call()方法实现了类似于其他语言的方法重载。
方法覆盖(override)
所谓覆盖,从本质上来说就是重写。就是当子类继承父类的一些方法后,子类又在其内部定义了相同的方法,则这个新定义的方法会覆盖继承而来的父类的方法,子类只能调用其内部定义的方法。
有以下几点要求:
1.当一个父类和子类有一个方法,参数和名字完全一致,那么子类方法会覆盖父类的方法。
2.在实行方法覆盖的时候,访问修饰符可以是不一样的,但是子类的访问范围必须大于等于父类的访问范围。
3.要求参数和名字一样。并不是要求子类,父类名称相同。
下面是对这几点的解释:
第一点,必须参数一致,才会实现方法覆盖。当参数个数不一致,则会报错(这就牵扯到上面说所得方法重载)。当方法名字不一致,就不会覆盖,只是子类新定义的方法。;
第二点,这是php这些语言设计时的规定吧。我是这么理解的是访问高一层的东西比较容易,如果再去访问底层的东西权限肯定要高一些。
看代码:
class<span> people{ protected function<span> sing(){ echo "人唱歌"<span>; } } class woman extends<span> people{ public function<span> sing(){ echo "女人唱歌"<span>; } } $woman1=new<span> woman(); $woman1->sing();</span></span></span></span></span></span></span>
这样很正常的可以输出“女人唱歌”。但当把woman里的sing()方法改为proctcted,父元素改成public()时,即将父类的访问权限设置的大于子类后,就会报下面的错误。
第三点,是要求参数和名字一样,具体就是要求参数的个数与父类相同,而并不是参数名称一致。即传递的参数名字可以为任意,只要保证传递的个数相同即可。
上面简介了PHP语言中多态的两个实现。
嗯,差不多就是这样。。

Java作为一门常见的编程语言,其在IT行业中有着广泛的应用,成为了许多公司招聘中的重要技能之一。在Java开发岗位的面试中,面试官往往会问及一些常见的Java问题,以此考察应聘者的Java编程水平。本文将列举几个常见的Java面试问题及其答案,供广大应聘者参考。什么是Java虚拟机?答:Java虚拟机(JVM)是一种虚拟的计算机,可以执行Java字节码。它

PHP的面向对象编程范式为项目管理和组织提供优势随着互联网的飞速发展,各种规模的网站和应用程序如雨后春笋般涌现出来。为了满足日益增长的需求,并提高开发效率和可维护性,采用面向对象编程(Object-OrientedProgramming,简称OOP)的方法成为了现代软件开发的主流。在PHP这样的动态脚本语言中,OOP为项目管理和组织带来了许多优势,本文将介

随着计算机应用的不断普及和发展,程序设计语言也不断演化和更新。面向对象编程语言在当今程序设计中占据了主导地位,而MySQL则是最流行的关系型数据库管理系统之一。如何在面向对象编程中结合使用MySQL实现更优雅的代码呢?一、面向对象编程的基本概念面向对象编程(ObjectOrientedProgramming,简称OOP)是一种编程思想,它强调对象的概念和

Java是一种面向对象编程语言,具备三个重要的特性:封装、继承和多态。这三个特性使得Java程序具有高度的可重用性、可维护性和可扩展性。在本文中,我们将介绍Java面向对象编程的三个重要特性。一、封装封装是面向对象编程的基础。它是指将数据和行为封装在一起,保护数据不被直接访问,而是通过类的接口进行访问。封装可以使得程序更加安全、可靠和易于维护。在Java中,

PHP面向对象编程中的访问者模式解析访问者模式是一种常用的设计模式,它可以分离数据结构和处理逻辑,使得同一个数据结构可以有不同的处理逻辑,而且可以在不修改数据结构的情况下增加新的处理逻辑。在PHP中,访问者模式可以帮助我们更好地组织代码,并提高代码的可维护性和可扩展性。本文将深入探讨PHP面向对象编程中的访问者模式,并通过示例代码进行解析。一、模式概述访问者

面向对象编程是一种编码设计,它使用数据来表示一组指令。它是一种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它由描述状态的属性和用来实现对象行为的方法组成,完成了从数据模型到处理模型的结合与统一。

理解PHP面向对象编程中的工厂模式工厂模式是一种常用的设计模式,它用于创建对象的过程中将对象的创建和使用解耦。在PHP面向对象编程中,工厂模式可以帮助我们更好地管理对象的创建和生命周期。本文将通过代码示例来详细介绍PHP中的工厂模式。在PHP中,我们可以通过使用工厂模式来实现对象的创建和初始化过程,而不是直接使用new关键字。这样做的好处是,如果将来需要改变

解析PHP面向对象编程中的类属性和方法PHP是一种被广泛应用于Web开发的脚本语言,它支持面向对象编程(OOP)的特性。在PHP中,类是一种用来创建对象的蓝图或模板,而属性和方法则是类的核心部分。本文将深入解析PHP面向对象编程中的类属性和方法,并通过代码示例来加深理解。一、类属性类属性是指用于描述类的特有数据的变量。它们可以存储对象的状态和特征。在PHP中


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版
中文版,非常好用