首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是php中的函数重载和重写?

什么是php中的函数重载和重写?
EN

Stack Overflow用户
提问于 2010-06-08 12:30:47
回答 10查看 251.8K关注 0票数 135

在PHP中,函数重载和函数重写是什么意思?它们之间的区别是什么?不知道它们之间的区别是什么。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-06-08 12:35:19

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

在PHP中,您只能使用神奇的方法__call重载方法。

覆盖的示例

代码语言:javascript
复制
<?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"
?>
票数 195
EN

Stack Overflow用户

发布于 2010-06-08 12:37:46

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

代码语言:javascript
复制
class Addition {
  function compute($first, $second) {
    return $first+$second;
  }

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

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

代码语言:javascript
复制
class Addition {
  function compute($first, $second, $third = 0) {
    return $first+$second+$third;
  }
}

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

代码语言:javascript
复制
class Substraction extends Addition {
  function compute($first, $second, $third = 0) {
    return $first-$second-$third;
  }
}

例如,compute将覆盖Addition中规定的行为。

票数 112
EN

Stack Overflow用户

发布于 2010-08-31 08:24:24

严格地说,这是没有区别的,因为您不能这样做:)

函数重写本来可以用一个PHP扩展来完成,比如APD,但是它已经被弃用了,而且afaik上一个版本是不可用的。

由于动态类型,PHP中的函数重载无法完成,也就是说,在PHP中,您不能将变量“定义”为特定类型。示例:

代码语言:javascript
复制
$a=1;
$a='1';
$a=true;
$a=doSomething();

每个变量都有不同的类型,但你可以在执行前知道类型(见第四个)。作为比较,其他语言使用:

代码语言:javascript
复制
int a=1;
String s="1";
bool a=true;
something a=doSomething();

在最后一个示例中,您必须强制设置变量的类型(例如,我使用了数据类型"something")。

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

代码语言:javascript
复制
function hello($a){
  print_r(func_get_args());
}

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

hello('a');
hello('a','b');

考虑到这两个函数都接受任意数量的参数,编译器应该选择哪一个?

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

方法类似于函数,但特定于类,在这种情况下,PHP确实允许在类中进行重载,但由于语言语义的原因,同样不允许重载。

总而言之,像Javascript这样的语言允许重载(但同样,不允许重载),但是它们也可能显示重写用户函数和方法之间的差异:

代码语言:javascript
复制
/// Function Overriding ///

function a(){
   alert('a');
}
a=function(){
   alert('b');
}

a(); // shows popup with 'b'


/// Method Overriding ///

var a={
  "a":function(){
    alert('a');
  }
}
a.a=function(){
   alert('b');
}

a.a(); // shows popup with 'b'
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2994758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档