Istnieją trzy scenariusze (które przychodzą mi do głowy), w których można wywołać metodę w podklasie, w której metoda kończy się w klasie nadrzędnej:
Metoda nie jest nadpisywana przez podklasę, istnieje tylko w rodzicu.
To jest to samo, co twój przykład i ogólnie lepiej jest użyć opcji $this -> get_species();
Masz rację, że w tym przypadku obie są faktycznie takie same, ale metoda została odziedziczona przez podklasę, więc nie ma powodu, aby różnicować. Używając $this
, zachowujesz spójność między metodami dziedziczonymi i zadeklarowanymi lokalnie.
Metoda jest nadpisywana przez podklasę i ma całkowicie unikalną logikę od rodzica.
W tym przypadku oczywiście chciałbyś użyć, $this -> get_species();
ponieważ nie chcesz, aby wersja metody nadrzędna była wykonywana. Ponownie, konsekwentnie używając $this
, nie musisz się martwić różnicą między tym przypadkiem a pierwszym.
Metoda rozszerza klasę nadrzędną, dodając do tego, co osiąga metoda nadrzędna.
W takim przypadku nadal chcesz używać `$this -> get_species();
podczas wywoływania metody z innych metod podklasy. Jedynym miejscem, w którym nazwiesz metodę nadrzędną, będzie metoda, która zastępuje metodę nadrzędną. Przykład:
abstract class Animal {
function get_species() {
echo "I am an animal.";
}
}
class Dog extends Animal {
function __construct(){
$this->get_species();
}
function get_species(){
parent::get_species();
echo "More specifically, I am a dog.";
}
}
Jedyny scenariusz, jaki mogę sobie wyobrazić, w którym musiałbyś wywołać metodę nadrzędną bezpośrednio poza metodą nadpisującą, byłby taki, gdyby robili dwie różne rzeczy i wiedziałeś, że potrzebujesz wersji metody nadrzędnej, a nie lokalnej. Nie powinno tak być, ale gdyby tak się stało, czystym sposobem podejścia do tego byłoby utworzenie nowej metody o nazwie takiej jak w get_parentSpecies()
przypadku, gdy wszystko, co robi, to wywołanie metody nadrzędnej:
function get_parentSpecies(){
parent::get_species();
}
Ponownie, dzięki temu wszystko jest ładne i spójne, pozwalając na zmiany / modyfikacje metody lokalnej zamiast polegania na metodzie nadrzędnej.
$leg = new leg()
wnętrzehuman
, jak nazwałbym funkcje ludzkie z wnętrza instancji nogi$leg
?O ile nie rozumiem źle pytania, prawie zawsze używałbym $ this-> get_species, ponieważ podklasa (w tym przypadku pies) mogłaby nadpisać tę metodę, ponieważ ją rozszerza. Jeśli klasa pies nie przedefiniuje metody, to oba sposoby są funkcjonalnie równoważne, ale jeśli w pewnym momencie w przyszłości zdecydujesz, że chcesz, aby metoda get_species w psie miała wypisać "pies", będziesz musiał wrócić przez cały kod Zmień to.
Kiedy używasz $ this, jest to faktycznie część obiektu, który utworzyłeś, więc zawsze będzie również najbardziej aktualna (jeśli używana właściwość zmieniła się w jakiś sposób w czasie życia obiektu) podczas używania klasy nadrzędnej wywołuje statyczną metodę klasy.
źródło