메서드 선언은 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)에 문 을 포함하는 것을 잊은 경우 메서드 매개 변수가 동일하더라도이 오류가 발생합니다.
'code' 카테고리의 다른 글
SQL Server에서 group_concat을 사용하여 쿼리를 만드는 방법 (0) | 2020.08.19 |
---|---|
더 나은 점 : @SuppressLint 또는 @TargetApi? (0) | 2020.08.19 |
GIT에서 2 개의 분기를 병합 (0) | 2020.08.19 |
xmlns =“…”없이 객체를 XML로 직렬화하는 방법은 무엇입니까? (0) | 2020.08.19 |
PHP의 '폭발'이란 무엇입니까? (0) | 2020.08.19 |