berbagai cara memanggil metode induk di php

90

Awalnya saya bingung mengapa kedua metode memanggil dalam konstruktor berfungsi, tetapi sekarang saya pikir saya mengerti. Kelas yang diperluas mewarisi metode induk seolah-olah mereka dideklarasikan di kelas itu sendiri, DAN metode ada di induk, jadi keduanya harus berfungsi.

Sekarang saya bertanya-tanya apakah ada cara yang lebih disukai (yaitu praktik terbaik) untuk memanggil metode (melalui parentatau this), dan apakah ini benar-benar cara yang identik untuk menjalankan kode yang sama, atau jika ada peringatan saat menggunakannya yang lain.

Maaf, saya mungkin terlalu memikirkan ini.

abstract class Animal {

    function get_species() {

        echo "test";

    }

}

class Dog extends Animal {

    function __construct(){

        $this->get_species();
        parent::get_species();

    }

}

$spike = new Dog;
jerigen
sumber

Jawaban:

120

Ada tiga skenario (yang dapat saya pikirkan) di mana Anda akan memanggil metode di subkelas di mana metode keluar di kelas induk:

  1. Metode tidak ditimpa oleh subkelas, hanya ada di induk.

    Ini sama dengan contoh Anda, dan umumnya lebih baik menggunakan $this -> get_species(); Anda benar bahwa dalam kasus ini keduanya secara efektif sama, tetapi metode ini telah diwarisi oleh subkelas, jadi tidak ada alasan untuk membedakan. Dengan menggunakan $thisAnda tetap konsisten antara metode yang diwariskan dan metode yang dideklarasikan secara lokal.

  2. Metode ditimpa oleh subclass dan memiliki logika yang benar-benar unik dari induknya.

    Dalam kasus ini, Anda jelas ingin menggunakan $this -> get_species();karena Anda tidak ingin versi induk dari metode tersebut dieksekusi. Sekali lagi, dengan menggunakan secara konsisten $this, Anda tidak perlu khawatir tentang perbedaan antara case ini dan case pertama.

  3. Metode memperluas kelas induk, menambahkan apa yang dicapai metode induk.

    Dalam kasus ini, Anda masih ingin menggunakan `$this -> get_species();saat memanggil metode dari metode subclass lainnya. Satu-satunya tempat yang akan Anda panggil metode induk adalah dari metode yang menimpa metode induk. Contoh:

    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.";
         }
    }
    

Satu-satunya skenario yang dapat saya bayangkan di mana Anda perlu memanggil metode induk secara langsung di luar metode penimpaan adalah jika mereka melakukan dua hal yang berbeda dan Anda tahu Anda memerlukan versi orang tua dari metode tersebut, bukan lokal. Seharusnya tidak demikian, tetapi jika itu memang muncul dengan sendirinya, cara bersih untuk mendekatinya adalah dengan membuat metode baru dengan nama seperti di get_parentSpecies()mana yang dilakukannya hanyalah memanggil metode induk:

function get_parentSpecies(){

     parent::get_species();
}

Sekali lagi, ini membuat semuanya tetap bagus dan konsisten, memungkinkan perubahan / modifikasi pada metode lokal daripada mengandalkan metode induk.

Anthony
sumber
bagaimana saya melakukannya tanpa "memperpanjang"? seperti saya memiliki beberapa "kaki" kelas di dalam kelas "manusia" tetapi saya tidak benar-benar perlu memperpanjangnya, karena saya tidak memerlukan fungsi "manusia" orang tua. Sekarang, jika saya membuat bagian $leg = new leg()dalam human, bagaimana saya memanggil fungsi manusia dari dalam contoh kaki $leg?
pengguna151496
@ user151496 Sebuah kaki bukanlah subkelas dari manusia. Manusia memiliki banyak kaki, tapi kaki bukanlah tipe manusia. Oleh karena itu Anda tidak boleh memiliki golongan kaki yang merupakan warisan dari manusia, karena kaki bukanlah manusia.
Beetle
Apakah Anda akan menjadikan Leg sebagai kelas yang memiliki antarmuka Leggy? Atau hanya memiliki kelas Manusia menerapkan Leggy? Bagaimana kita dapat mendefinisikan dengan baik bahwa kaki tidak eksklusif untuk manusia, tetapi juga bahwa kaki manusia adalah manusia yang unik dan milik umum manusia?
Anthony
2
paamayim nekudotayim agak membingungkan. Sekilas sepertinya Anda memanggil metode statis. Seharusnya itu adalah parent-> get_species () sebagai gantinya
peterchaula
Sepakat. Panggilan statis sangat membingungkan dalam banyak hal. Saya harus memperbarui ini di beberapa titik.
Anthony
5

Kecuali saya salah paham dengan pertanyaannya, saya hampir selalu menggunakan $ this-> get_species karena subclass (dalam kasus ini anjing) dapat menimpa metode itu karena ia memperpanjangnya. Jika anjing kelas tidak mendefinisikan kembali metode tersebut maka kedua cara tersebut secara fungsional setara tetapi jika di beberapa titik di masa mendatang Anda memutuskan ingin metode get_species pada anjing harus mencetak "anjing" maka Anda harus kembali melalui semua kode dan ubahlah.

Ketika Anda menggunakan $ this, itu sebenarnya adalah bagian dari objek yang Anda buat dan akan selalu menjadi yang terbaru juga (jika properti yang digunakan telah berubah entah bagaimana selama masa pakai objek) saat menggunakan kelas induk memanggil metode kelas statis.

hackartist
sumber
itu poin yang bagus tentang menggunakan $ this jika saya ingin mengganti metode ini. Terima kasih
jerry