手机版

对PHP中面向对象编程方法重载和方法覆盖(多态性)的深刻理解

时间:2021-09-19 来源:互联网 编辑:宝哥软件园 浏览:

什么是多态性?

多态字面意思是“多种状态”。在面向对象语言中,接口的许多不同实现被称为多态性。引用查理卡尔弗茨对多态的描述——多态是一种技术,允许您将父对象设置为等于它的一个或多个子对象。分配后,父对象可以根据当前分配给它的子对象的特征以不同的方式进行操作。简单来说就是一句话:允许将子类类型的指针赋给父类类型的指针(没错,这句话来自百度百科)。那么多态性的作用是什么,它的实际开发价值是什么?在实际应用开发中,在面向对象中采用多态性主要在于可以将不同的子类对象作为父类对待,屏蔽不同子类对象之间的差异,编写通用的代码和编程来适应不断变化的需求。

下面是PHP中多态性的两种实现。

方法重载(重载)

重载是类多态性的一种实现。函数重载就是用一个标识符作为多个函数名,这些同名的函数可以通过函数的参数个数或者参数类型来区分,不会混淆调用。即在调用时,虽然方法名称相同,但可以根据不同的参数自动调用相应的函数。

A类{ public function test(){ echo ' test1 };}公共函数测试($ a){ echo ' test2 ';} } $ A=new A();$ a-test();$ a-测试($ a);

如果php直接支持方法重载。那么在上面的例子执行之后,传递参数和不传递参数会返回不同的值。然而,php并不直接支持重载,这意味着如果您如上定义它,您将报告一个错误。报告有什么问题?将报告以下错误。

这意味着A函数不能重复定义,报告错误的行数正好是下面一行。

函数测试($ a){所以php不直接支持重载。说了这么多,php不支持它。别担心,我说了不是直接支持,所以我们可以让php间接支持。此时,需要一个函数来支持重载。Is __call()。__call()方法必须采用两个参数。第一个参数包含被调用方法的名称,而第二个参数包含传递给该方法的参数数组。这种方法可以实现类似函数重载的功能。看看下面的代码。

public function __call($method,$ p){ if($ method==' display '){ if(is _ object($ p[0]){ $ this-display object($ p[0]);} else if(is _ array($ p[0]){ $ this-display array($ p[0]);} else { $ this-display scalar($ p[0]);} } }//下面是对上面定义$ov=new重载的调用;$ over-display(array(1,2,3));$ over-display(' cat ');定义方法时,可以看到有三个分支。如果将对象传递给display()方法,则调用displayObject()方法;如果传递了数组,则调用DisplayArray();如果传递了其他内容,则调用displayScalar()方法。您可以看到,当进行下面的调用时,第一个调用是传递一个数组,因此调用displayArray()。第二个既不是对象也不是数组,属于其他东西,调用displayScalar()方法。因此,通过这种方式,__call()方法实现了类似于其他语言的方法重载。

方法覆盖(覆盖)

覆盖本质上是重写。也就是说,当一个子类继承了其父类的一些方法,并在其中定义了相同的方法时,新定义的方法将覆盖其父类的继承方法,子类只能调用其内部定义的方法。

有以下要求:

1.当父类和子类的方法具有完全相同的参数和名称时,子类方法将覆盖父类方法。

2.实现方法覆盖时,访问修饰符可以不同,但子类的访问范围必须大于或等于父类的访问范围。

3.参数必须与名称相同。不需要子类;父类的名称是相同的。

以下是对这些要点的解释:

首先,只有参数一致,才能实现方法覆盖。当参数的数量不一致时,将会报告一个错误(这涉及到上述获得的方法的重载)。当方法名称不一致时,不会覆盖,只覆盖子类新定义的方法。

第二,这是php的设计规则。我理解的是,更高层次的东西更容易获取。如果你再去拜访下层的东西,权威肯定更高。

看看代码:

类人{ protected function sing(){ echo ' people sing ';}}类女人延伸人{公共函数sing(){ echo ' women sing ';} } $ woman 1=new woman();$ women 1-sing();输出“女人唱歌”很正常。但是,当woman中的sing()方法更改为proctcted并且父元素更改为public()时,即当父类的访问权限设置为大于子类的访问权限时,将会报告以下错误。

第三点是要求参数和名字一样,具体来说就是要求参数的个数和父类的个数一样,但是参数的名字不一样。也就是说,传递的参数名称可以是任意的,只要传递的参数数量相同。

上面简单介绍了PHP语言中多态性的两种实现。

PS:分析重写、覆盖、重载和多态的区别。

重写-重写(=override),重载-重载,多态-多态。

重写重写方法以实现不同的函数。它通常用于子类在继承父类时重写(重新实现)父类中的方法。覆盖(覆盖)以下规则:

1.重写方法的参数列表必须与重写方法的参数列表完全相同,否则不能称为重写而是重载。2.重写方法的访问修饰符必须大于重写方法的访问修饰符(publicprotecteddefaultprivate)。3.重写方法的返回值必须与重写方法的返回值一致;4.重写方法引发的异常必须与重写方法引发的异常一致,或者是它的子类;5.重写的方法不能是私有的,否则,在其子类中只定义了一个新方法,并且不会重写。6.静态方法不能重写为非静态方法(会出现编译错误)。

重载是一种重载,通常用于在一个类中实现多个重载方法。这些方法名称相同,但参数形式不同。

过载规则:

1.重载只能通过相同的方法名和不同的参数形式来实现。不同的参数类型可以是不同的参数类型、不同的参数编号、不同的参数序列(参数类型必须不同);2.不能通过访问权限、返回类型和引发的异常来执行重载;3.异常类型和方法数量不会影响重载;

多态性的概念是复杂的,具有多种含义的多态性。一个有趣但不精确的说法是继承是子类使用父类的方法,而多态是父类使用子类的方法。

通常,我们使用多态性来避免父类中大量重载导致的代码膨胀和维护困难。

例如:

公共类Shape {公共静态void main(String[]args){ Triangle tri=new Triangle();“三角形是一种形状?”tri . issshape());//继承Shape Shape=new Triangle();System.out.println('我的形状有' shape.getSides()'个边');//多态矩形Rec=新矩形();shape2=RecSystem.out.println('我的形状有' shape2.getSides(Rec)'边');//重载} public boolean is shape(){返回true} public int getSides(){ return 0;} public int get sides(三角形tri){//重载return 3;} public int get sides(rectangle rec){//重载return 4;}} class triangle扩展shape { public int get sides(){//重写实现多态返回3;}}类矩形扩展形状{ public int get sides(int I){//重载return I;}}请注意,Triangle类的方法是一个重写,而Rectangle类的方法是一个重载。比较两者,我们可以发现多态性相对于重载的优势:

如果使用重载,应该为父类中的每个子类重载一个获取边数的方法。

如果使用多态性,父类只提供了一个获取边数的接口。至于用哪种形状获得边数以及如何获得,都是在子类中实现(重写)的。

版权声明:对PHP中面向对象编程方法重载和方法覆盖(多态性)的深刻理解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。