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

什么是多态性



多态性(polymorphism)的字面意思是多种状态。在面向对象的语言,各种实现接口的多态性。描述多态性多态性Charlie Calverts参考,允许你设置一个与一个或一个以上的他的子对象相等的父对象,赋值之后,父对象可以分它的子对象的当前特性以不同的方式(从Delphi4编程内幕接)。在一个简单的方法,就是一句话:让一个指针的一个子类被分配给一个指向父类(这是从百度百科吧)。那么什么是多态性的影响,发展它的实用价值是什么在实际应用中,面向对象的多态性主要表现在不同的子类对象作为父类来对待,以及不同的屏蔽子类对象之间的差异,编写泛型代码,做一个通用的编程,以适应不断变化的需求。



以下是PHP中的两个多态实现



方法重载(过载)



重载是一个类的多态性的实现。函数重载意味着一个标识符作为多功能的名称,并可通过参数或函数的参数类型的数量区分相同名称的函数,并调用不会混淆。时称,尽管该方法是同一个名字,它可以自动根据不同的参数调用相应的函数。




类{
公共功能测试(){
回声Test1;
}
公共功能测试($ A){
回声test2;
}
}
美元=新的A();
测试();
测试($ A);






如果PHP直接支持重新加载方法,那么上面的例子执行返回和非参数并返回一个不同的值。但是,PHP并不能直接支持重载,这意味着如果直接定义上面的内容,它将是错误的,它有什么问题将报告以下错误。




这意味着函数不能被重新定义,错误行的数目也是以下行。


公共功能测试($ A){


所以,PHP不直接支持重载。说这么长时间不支持PHP的。别担心,我说的不是直接的支持,这样我们就可以让PHP间接支持。使用一个函数在这个时候支持重负荷。这是__call()的__call()。方法必须有两个参数,第一个包含调用的方法的名称,第二个参数包含传递给该方法的参数数组。用这种方法可以实现的功能类似于函数重载。看看下面的代码。




公共功能__call($法$ P)
{
如果(方法){
如果(is_object(P { 0 })){
美元-> DisplayObject(P { 0 });
} else if(is_array(P { 0 })){
美元-> displayarray(P { 0 });
其他{ }
美元-> displayscalar(P { 0 });
}
}
}
下面是上面的调用定义
$ OV =新的过载;
$ OV ->显示(阵列(1,2,3));
$ OV ->显示(猫的);


当定义的方法,我们可以看到有三个分支机构,如果一个对象被传递到显示器()方法,它被称为(DisplayObject)方法;如果传递的是一个数组,称为displayarray();二是实词的转移,然后调用displayscalar()方法…当你看到下面的电话,首先是一个数组的传递,和displayarray()被调用。二进不是一个对象或数组;属于其他,和displayscalar()方法被调用,所以这就是__call()方法实现方法类似于其他语言的重装。



方法覆盖(覆盖)



所谓覆盖,在本质上,是重写。当类从父类继承的子方法,并定义了其内部的方法覆盖父类的方法的继承的方法定义的新方法,一个类只能被称为内部定义。



有以下要求:



1。当父类和子类有一个方法时,参数和名称是完全相同的,然后子类方法覆盖父方法。



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



三.需要与名称相同的参数。不在她的类中,父类名称是相同的。



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



首先,如果参数必须一致,就可以得到方法覆盖,当参数的数目不一致时,报告错误(在上述重载方法中涉及),当该方法的名称不一致时,它不会覆盖,只有一个新定义的子类方法。;



第二,这是PHP语言设计的规则,我理解它更容易访问更高的层次,如果你深入到底层,它必须更高。



看代码:


类人{
受保护函数唱歌(){
回声男人唱歌;
}
}
类女人延伸人{
公共函数唱(){
回声女人唱;
}
}
为女=新女性();
$女->唱();




这是妇女唱正常。但当唱()方法在女人改变proctcted,父元素变为公共()。当父类的访问权限大于子类的访问权限时,将报告以下错误。




第三点是要求与名称相同的参数,特别是参数的数量必须与父级相同,但参数名称不相同,即传递参数的名称可以任意,只要传递的数量保证相同。



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

ps:重写、覆盖、重载和多态的概念分析

重写(重写)和重载>,多态性,多态性,重载



重写是一种重写(重写)来实现不同函数的方法,它通常用于在父类继承父类时重写父类中的方法。

重写(覆盖)规则:

1。重写参数列表必须与重写方法完全相同,否则不能称为重写,而是重载。

2,重写方法的访问修饰符必须大于重写方法的访问修饰符(public <保护>默认>私有)。

三.重写方法的返回值必须与重写方法的返回值一致;

4。重写方法抛出的异常必须与重写方法或其子类引发的异常一致。

5。重写的方法不能是私有的,否则在其子类中定义一个新方法,并且它不会重写。

6,静态方法不能重写为非静态方法(编译错误)。



重载是一种重载,通常用于在具有相同名称和不同参数形式的类中实现许多重载方法。

重载的规则:

1。重载时,只能用相同的方法名和不同的参数形式来实现,不同的参数类型可以是不同的参数类型、不同的参数数、不同的参数顺序(参数类型必须不同)。

2,它不能被访问权限、返回类型和抛出异常重载。

三.方法的异常类型和数量不会影响重载。



多态概念更复杂,多态性更高。有一个有趣但不严谨的说法,继承是子类使用父类的方式,多态是父类使用子类的方式。



一般来说,我们使用多态性来避免在父类,人浮于事,难以维持重过载。

例如 uff1a


形状类
{
public static void main(String { } args){
三角形=新三角形();
System.out.println(三角形是一种形状tri.isshape(+)); / /继承
形状=新三角形();
System.out.println(我的形状(形状。getsides)+边。); / /多态性
矩形=新矩形();
形状shape2 = REC;
System.out.println(我的形状+ shape2.getsides(REC)+边。); / /重
}
公共布尔isshape(){
返回true;
}
getsides public int(){
返回0;
}
public int getsides(三角形){ / /过载
返回3;
}
public int getsides(矩形REC){ / /过载
返回4;
}
}
类三角形扩展形状
{
public int(getsides){ / /改写,实现多态性
返回3;
}
}
类矩形扩展形状
{
public int getsides(int i){ / /过载
还我;
}
}


注意三角形类的方法被重写,矩形类的方法重载,与之相比,多态性对重载的好处是可以发现的:



如果是一个沉重的负荷,一种让边数的方法是重新为每个子类在父类。



如果使用多态性,父类只提供边缘数目的接口,以及如何获得形状的边数以及如何在子类中实现该形状。