2011-07-14 12 views
9

Pojawia się (PHP 5.3), że jeśli nadpisujesz metodę klasy, , można w porządku dodać dodatkowe parametry, o ile mają one wartości domyślne.dodawanie parametrów do nadpisanej metody E_STRICT obserwacja

Rozważmy na przykład klasę:

class test1 { 
    public function stuff() { 
    echo "Hi"; 
    } 
} 

następujące klasy rozciąga „test1” i będzie produkować ostrzeżenie E_STRICT.

class test2 extends test1 { 
    public function stuff($name) { 
    echo "Hi $name"; 
    } 
} 

Jednak poniższe elementy nie generują ostrzeżenia E_STRICT.

class test3 extends test1 { 
    public function stuff($name = "") { 
    echo "Hi $name"; 
    } 
} 

Chociaż klasa „test3” nie przynosi ostrzeżenie E_STRICT, byłem pod wrażeniem, że PHP nie pozwala podpisy metoda być przeciążony nadpisane. Muszę zapytać. Czy moja obserwacja jest błędem/błędem, czy też właściwym zamierzeniem? prawidłowe?

Ponadto, jeśli domyślny parametr argumentem jest w porządku, to dlaczego jest parametrem non-default argumentem nie w porządku?

+0

Mam zestaw error_reporting (E_ALL) i nie mogę odtworzyć błędu E_STRICT. czy możesz opublikować błąd, który widzisz? Nie jest to również przypadek "przeciążenia", jest to "nadpisywanie". – helloandre

+0

@helloandre, E_STRICT nie jest zawarty w E_ALL. Aby włączyć powiadomienia E_STRICT, ustaw "error_reporting (E_ALL | E_STRICT);" –

+1

@helloandre, a E_STRICT nie jest generowane dla tego przypadku :) –

Odpowiedz

-1

To nie jest błąd i jest akceptowalną praktyką programowania PHP.

Należy pamiętać, że wielokrotne przesłonięcia mogą powodować programmer headaches i należy ich unikać w miarę możliwości.

Alternatywnie zwykle mam jedną rozszerzoną klasę do nadpisania dla każdej klasy lub po prostu przeciążam metodę klasy w samej klasie.

5

Po dodaniu parametru innego niż domyślny do metody nadpisanej, podklasa nie spełnia już warunków umowy zdefiniowanej przez nadklasę. Nie można poprawnie wywołać metody test2-> stuff(), ponieważ ta metoda oczekuje teraz parametru - ale superklasa mówi, że powinieneś móc ją wywołać bez niej. Stąd ostrzeżenie E_STRICT.

Jeśli jednak dodasz parametr domyślny, możesz nadal wywoływać test3-> stuff() (z twojego przykładu) - jak oczekuje superklasa - a więc umowa nie jest zepsuta. W rzeczywistości, dodając opcjonalny parametr, po prostu go rozszerzyłeś.

Powiązane problemy