code

메서드 선언은 PHP의 부모 메서드와 호환되어야합니다.

codestyles 2020. 8. 19. 08:09
반응형

메서드 선언은 PHP의 부모 메서드와 호환되어야합니다.


엄격한 표준 : childClass :: customMethod () 선언은 parentClass :: customMethod () 선언과 호환되어야합니다.

PHP에서이 오류의 가능한 원인은 무엇입니까? 호환성의 의미에 대한 정보는 어디에서 찾을 수 있습니까 ?


childClass::customMethod()인수가 다르거 나 액세스 수준 (공개 / 개인 / 보호)이 parentClass::customMethod().


이 메시지는 런타임에 실패 할 수있는 특정 가능한 메소드 호출이 있음을 의미합니다. 당신이 가지고 있다고 가정

class A { public function foo($a = 1) {;}}
class B extends A { public function foo($a) {;}}
function bar(A $a) {$a->foo();}

컴파일러는 매개 변수가 필요없는 A :: foo ()의 요구 사항에 대해 $ a-> foo () 호출 만 확인합니다. 그러나 $ a는 매개 변수가 필요한 클래스 B의 객체 일 수 있으므로 런타임에 호출이 실패합니다.

그러나 이것은 결코 실패 할 수 없으며 오류를 유발하지 않습니다.

class A { public function foo($a) {;}}
class B extends A { public function foo($a = 1) {;}}
function bar(A $a) {$a->foo();}

따라서 어떤 메소드도 상위 메소드보다 더 많은 필수 매개 변수를 가질 수 없습니다.

유형 힌트가 일치하지 않는 경우에도 동일한 메시지가 생성되지만이 경우 PHP는 훨씬 더 제한적입니다. 이것은 오류를 제공합니다.

class A { public function foo(StdClass $a) {;}}
class B extends A { public function foo($a) {;}}

이렇게 :

class A { public function foo($a) {;}}
class B extends A { public function foo(StdClass $a) {;}}

그것은 필요한 것보다 더 제한적인 것처럼 보이며 내부 때문이라고 생각합니다.

가시성 차이로 인해 다른 오류가 발생하지만 기본적인 이유는 동일합니다. 부모 메서드보다 덜 눈에 띄는 메서드는 없습니다.


오류를 끄지 않고 OOP 양식을 유지하려면 다음을 수행 할 수도 있습니다.

class A
{
    public function foo() {
        ;
    }
}
class B extends A
{
    /*instead of : 
    public function foo($a, $b, $c) {*/
    public function foo() {
        list($a, $b, $c) = func_get_args();
        // ...

    }
}

다음과 같이 함수 매개 변수에 힌트를 입력하는 경우 인터페이스 컨텍스트에서이 오류를 확장하면됩니다.

인터페이스 A

use Bar;

interface A
{
    public function foo(Bar $b);
}

클래스 B

class B implements A
{
    public function foo(Bar $b);
}

use구현 클래스 (Class B)에 문 을 포함하는 것을 잊은 경우 메서드 매개 변수가 동일하더라도이 오류가 발생합니다.

참고URL : https://stackoverflow.com/questions/3115388/declaration-of-methods-should-be-compatible-with-parent-methods-in-php

반응형