PHP에서 함수 오버로드와 함수 오버라이드는 무엇을 의미하며, 이 둘의 차이점은 무엇입니까?뭐가 다른지 알 수가 없었어요.
질문에 대한 답변
오버로드란 시그니처는 비슷하지만 파라미터가 다른 함수를 정의하는 것입니다.재정의는 부모 클래스가 메서드를 정의하고 파생 클래스가 해당 메서드를 재정의하려는 파생 클래스에만 관련됩니다.
PHP에서는 magic method를 사용한 메서드만 오버로드할 수 있습니다.
덮어쓰기 예:
<?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
는 2개의 다른 파라미터 시그니처로 오버로드되어 있습니다.* 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에서 함수 오버로드를 수행할 수 없습니다. 즉, PHP에서는 변수를 특정 유형으로 “정의”하지 않습니다.예:
$a=1; $a='1'; $a=true; $a=doSomething();
각 변수의 유형은 다르지만 실행 전에 유형을 알 수 있습니다(4번째 변수 참조).이에 비해 다른 언어에서는 다음이 사용됩니다.
int a=1; String s="1"; bool a=true; something a=doSomething();
마지막 예에서는 변수의 유형을 강제로 설정해야 합니다(예: 데이터 유형 “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');
양쪽 함수가 임의의 양의 인수를 받아들인다고 가정할 때 컴파일러는 어느 것을 선택해야 합니까?
마지막으로 위의 응답이 부분적으로 잘못된 이유를 지적하고 싶습니다. 함수 오버로드/오버라이딩은 메서드 오버로드/오버라이딩과 같지 않습니다.
여기서 메서드는 함수와 같으나 클래스에 고유하며, 이 경우 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');
} } a.a=function(){
alert('b'); }
a.a(); // 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);
PHP에서는 오버로드 패러다임이 완전히 지원되지는 않지만 기본 파라미터(또는 앞에서 언급한 바와 같이)로 동일한(또는 매우 유사한) 효과를 얻을 수 있습니다.
함수를 다음과 같이 정의할 경우:
function f($p=0) {
if($p)
{
//implement functionality #1 here
}
else
{
//implement functionality #2 here
} }
이 함수를 호출하는 경우:
f();
1개의 기능(#1)이 있습니다만, 다음과 같은 파라미터로 호출하면 다음과 같습니다.
f(1);
다른 기능(2번)이 제공됩니다.이것이 오버로드의 영향입니다.기능은 함수의 입력 파라미터에 따라 다릅니다.
이 함수를 f(0)라고 부르면 어떤 기능을 얻을 수 있는지 물어볼 것입니다.