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 ?

Author: waiwai933, 2010-06-25

4 answers

childClass::customMethod() ma inne argumenty lub inny poziom dostępu (publiczny/prywatny/chroniony) niż parentClass::customMethod().

 111
Author: davidtbernal,
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.

 32
Author: ldrut,
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();
        // ...

    }
}
 16
Author: Sajjad Shirazy,
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.

 0
Author: Spholt,
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