programing

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

bestcode 2022. 11. 6. 10:31
반응형

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

엄격한 기준:childClass 선언:: custom메서드()는 parentClass::custom과 호환성이 있어야 합니다.메서드()

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구현 클래스(클래스 B)의 스테이트먼트에서는 메서드 파라미터가 동일해도 이 에러가 발생합니다.

GitHub에서 기존 클래스를 확장하려다 이 문제에 직면하게 되었습니다.우선은 내가 해야 할 대로 수업을 쓰고, 그 다음에는 지금처럼 수업을 쓰면서 내 자신을 설명하려고 노력할 거야.

내가 생각한 것은

namespace mycompany\CutreApi;

use mycompany\CutreApi\ClassOfVendor;

class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
   public function whatever(): ClassOfVendor
   {
        return new ClassOfVendor();
   }
}

내가 마침내 한 일

namespace mycompany\CutreApi;

use \vendor\AwesomeApi\ClassOfVendor;

class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
   public function whatever(): ClassOfVendor
   {
        return new \mycompany\CutreApi\ClassOfVendor();
   }
}

따라서 namesched 클래스를 반환하는 메서드를 사용하여 같은 클래스를 반환하려고 하지만 다른 네임스페이스로 반환하려고 할 때도 이 오류가 발생합니다.다행히 이 솔루션을 찾았지만 php 7.2의 이 기능의 이점을 완전히 이해하지 못했습니다.저에게는 입력 파라미터의 정의나 메서드의 동작까지 포함해 필요에 따라 기존 클래스 메서드를 다시 쓰는 것이 일반적입니다.

이전 어플리케이션의 한 가지 단점은 IDE가 \mycompany\에서 구현된 새로운 메서드를 인식할 수 없다는 것입니다.CutreApi\ClassOfVendor().그래서 지금은 이 구현으로 하겠습니다.

현재 완료됨

namespace mycompany\CutreApi;

use mycompany\CutreApi\ClassOfVendor;

class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
   public function getWhatever(): ClassOfVendor
   {
        return new ClassOfVendor();
   }
}

그래서 '무엇이든' 방법을 쓰지 않고 '무엇이든'이라는 새로운 방법을 썼습니다.사실 둘 다 같은 작업을 하고 있습니다.클래스를 반환할 뿐이지만, 앞에서 설명한 것처럼 다른 네임스페이스로 되어 있습니다.

이게 누군가에게 도움이 되길 바라.

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

반응형