什么是函数重载和重写在PHP?

在PHP中,函数重载和函数重载是什么意思。 他们之间有什么区别? 无法弄清楚他们之间有什么区别。

重载是定义具有相似签名但具有不同参数的函数。 重写只与派生类有关,其中父类定义了一个方法,并且派生类希望覆盖该方法。

在PHP中,只能使用魔术方法__call重载方法。

重写的一个例子是:

 <?php class Foo { function myFoo() { return "Foo"; } } class Bar extends Foo { function myFoo() { return "Bar"; } } $foo = new Foo; $bar = new Bar; echo($foo->myFoo()); //"Foo" echo($bar->myFoo()); //"Bar" ?> 

当使用不同的参数集合定义相同的函数名称两次(或更多次)时,会发生函数重载。 例如:

 class Addition { function compute($first, $second) { return $first+$second; } function compute($first, $second, $third) { return $first+$second+$third; } } 

在上面的例子中,函数compute用两个不同的参数签名来重载。 *这在PHP中还不被支持。 另一种方法是使用可选参数:

 class Addition { function compute($first, $second, $third = 0) { return $first+$second+$third; } } 

在扩展一个类并重写父类中存在的函数时,会发生函数覆盖:

 class Substraction extends Addition { function compute($first, $second, $third = 0) { return $first-$second-$third; } } 

例如, compute覆盖Addition提出的行为。

严格来说,没有区别,因为你不能做:)

函数重写可以用像APD这样的PHP扩展完成,但是已经被弃用,并且afaik最后的版本是不可用的。

PHP中的函数重载不能由于dynamictypes而完成,也就是说,在PHP中,你不能将variables“定义”为特定的types。 例:

 $a=1; $a='1'; $a=true; $a=doSomething(); 

每个variables都是不同的types,但是你可以在执行前知道types(参见第四个)。 作为比较,其他语言使用:

 int a=1; String s="1"; bool a=true; something a=doSomething(); 

在最后一个例子中,你必须强制设置variables的types(例如,我使用数据types“something”)。


另一个“问题”为什么函数重载在PHP中是不可能的:PHP有一个叫func_get_args()的函数,它返回一个当前参数数组,现在考虑下面的代码:

 function hello($a){ print_r(func_get_args()); } function hello($a,$a){ print_r(func_get_args()); } hello('a'); hello('a','b'); 

考虑到这两个函数接受任何数量的参数,编译器应该select哪一个?


最后,我想指出为什么上面的回答是部分错误的; 函数重载/覆盖不等于方法重载/覆盖。

如果一个方法像一个函数,但是只针对一个类,在这种情况下,PHP确实允许在类中重写,但是由于语言语义的原因,不会重载。

总而言之,像JavaScript这样的语言允许重写(但是同样没有重载),但是它们也可以显示覆盖用户函数和方法之间的区别:

 /// Function Overriding /// function a(){ alert('a'); } a=function(){ alert('b'); } a(); // shows popup with 'b' /// Method Overriding /// var a={ "a":function(){ alert('a'); } } aa=function(){ alert('b'); } aa(); // shows popup with 'b' 

重载例子

 class overload { public $name; public function __construct($agr) { $this->name = $agr; } public function __call($methodname, $agrument) { if($methodname == 'sum2') { if(count($agrument) == 2) { $this->sum($agrument[0], $agrument[1]); } if(count($agrument) == 3) { echo $this->sum1($agrument[0], $agrument[1], $agrument[2]); } } } public function sum($a, $b) { return $a + $b; } public function sum1($a,$b,$c) { return $a + $b + $c; } } $object = new overload('Sum'); echo $object->sum2(1,2,3); 

尽pipePHP没有完全支持重载范例,但是使用默认参数(如之前提到的那样)可以实现相同(或非常相似)的效果。

如果你像这样定义你的function:

 function f($p=0) { if($p) { //implement functionality #1 here } else { //implement functionality #2 here } } 

当你像这样调用这个函数:

 f(); 

你会得到一个function(#1),但如果你调用它的参数如:

 f(1); 

你会得到另一个function(#2)。 这就是重载的效果 – 根据函数的input参数不同的function。

我知道,如果他/她把这个函数调用为f(0),有人会问现在会得到什么function。

我想在这里指出,PHP中的重载与其他编程语言相比,具有完全不同的含义。 很多人都说过,PHP不支持重载,而通过重载的传统定义,是的,这个function没有明确提供。

但是,在PHP中重载的正确定义是完全不同的。

在PHP中,重载是指使用魔术方法(如__set()和__get())dynamic创build属性和方法。 当与不可访问或未声明的方法或属性进行交互时,将调用这些重载方法。

以下是PHP手册的链接: http : //www.php.net/manual/en/language.oop5.overloading.php

PHP 5.xx不支持重载这是为什么PHP不完全OOP。