메서드 선언은 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
'programing' 카테고리의 다른 글
MySQL에서 '존재하지 않는 경우 삽입'을 하려면 어떻게 해야 합니까? (0) | 2022.11.06 |
---|---|
@여러 메서드 인수의 캐시 가능한 키 (0) | 2022.11.06 |
JavaScript에서 변수가 숫자인지 문자열인지 확인합니다. (0) | 2022.10.27 |
리스트 통합의 람다 함수 (0) | 2022.10.27 |
Android에서 AMP(apache mysql ph) 실행 (0) | 2022.10.27 |