Deklaracja metod powinna być zgodna z metodami nadrzędnymi w PHP
Strict Standards: Declaration of childClass::customMethod() should be compatible with that of parentClass::customMethod()
Jakie są możliwe przyczyny tego błędu w PHP? Gdzie mogę znaleźć informacje o tym, co to znaczy być kompatybilnym ?
4 answers
childClass::customMethod()
ma inne argumenty lub inny poziom dostępu (publiczny/prywatny/chroniony) niż parentClass::customMethod()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 03:40:09
Ta wiadomość oznacza, że istnieją pewne możliwe wywołania metod, które mogą się nie udać w czasie wykonywania. Załóżmy, że masz
class A { public function foo($a = 1) {;}}
class B extends A { public function foo($a) {;}}
function bar(A $a) {$a->foo();}
Kompilator sprawdza tylko wywołanie $a - >foo() pod kątem wymagań metody::foo (), która nie wymaga żadnych parametrów. $a może być jednak obiektem klasy B, który wymaga parametru, więc wywołanie nie powiedzie się w czasie wykonywania.
To jednak nigdy nie może zawieść i nie powoduje błędu
class A { public function foo($a) {;}}
class B extends A { public function foo($a = 1) {;}}
function bar(A $a) {$a->foo();}
Więc żadna metoda nie może mieć bardziej wymaganych parametrów niż jej metoda rodzica.
Ta sama wiadomość jest również generowana, gdy podpowiedzi typów nie pasują, ale w tym przypadku PHP jest jeszcze bardziej restrykcyjne. To daje błąd:
class A { public function foo(StdClass $a) {;}}
class B extends A { public function foo($a) {;}}
Tak jak to:
class A { public function foo($a) {;}}
class B extends A { public function foo(StdClass $a) {;}}
To wydaje się bardziej restrykcyjne, niż musi być i zakładam, że jest to spowodowane wewnętrznymi.
Różnice widoczności powodują inny błąd, ale z tego samego podstawowego powodu. Żadna metoda nie może być mniej widoczna niż jej metoda nadrzędna.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-11 19:01:12
Jeśli chcesz zachować formę OOP bez wyłączania błędu, możesz również:
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();
// ...
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-06 08:00:20
Po prostu rozwiń ten błąd w kontekście interfejsu, jeśli wpisujesz hinting parametrów funkcji tak:
Interfejs A
use Bar;
interface A
{
public function foo(Bar $b);
}
Klasa B
class B implements A
{
public function foo(Bar $b);
}
Jeśli zapomniałeś dodać use
instrukcję na swojej klasie implementującej (Class B), otrzymasz również ten błąd, nawet jeśli parametry metody są identyczne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-21 09:41:58