Rumah > Artikel > pembangunan bahagian belakang > Mengapa Saya Tidak Boleh Mengatasi Parameter Kaedah dengan Antara Muka Anak sebagai Parameter Baharu dalam PHP?
Mengatasi Parameter Kaedah dengan Antara Muka Kanak-kanak sebagai Parameter Baharu: Mengapa Ia Gagal
Dalam PHP, kaedah overriding membenarkan subkelas mentakrifkan semula tingkah laku kaedah yang diwarisi daripada kelas induk. Walau bagaimanapun, terdapat sekatan tertentu untuk memastikan keserasian jenis dan pematuhan kepada prinsip OOP.
Pertimbangkan coretan kod berikut, yang cuba mengatasi kaedah setEngine() dalam antara muka WaterCar dengan parameter baharu jenis HydroEngine :
<code class="php"><?php interface Engine { function run(); } interface HydroEngine extends Engine { function run(); } interface Car { function setEngine(Engine $engine); } interface WaterCar extends Car { function setEngine(HydroEngine $engine); } ?></code>
Coretan kod ini gagal dengan ralat berikut:
Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
Sebab ralat ini ialah parameter kaedah mengatasi melanggar prinsip penggantian Liskov. Antara muka WaterCar mengisytiharkan jenis parameter yang berbeza untuk kaedah setEngine() daripada antara muka Kereta.
Secara khusus, antara muka Kereta menjangkakan parameter jenis Enjin, manakala antara muka WaterCar menjangkakan parameter jenis HydroEngine. Walaupun HydroEngine ialah subkelas Enjin, ia masih dianggap sebagai jenis yang berbeza.
Akibatnya, kelas yang melaksanakan WaterCar mungkin tidak dapat melaksanakan Kereta sepenuhnya kerana ia tidak dapat menerima parameter Enjin. Ini melanggar prinsip penggantian Liskov, yang menyatakan bahawa subjenis sepatutnya boleh digunakan sebagai ganti jenis induknya tanpa menyebabkan kelakuan yang tidak dijangka.
Dalam erti kata lain, jika sesuatu fungsi mengharapkan Kereta, ia sepatutnya dapat untuk menerima WaterCar tanpa sebarang masalah. Walau bagaimanapun, dalam kes ini, fungsi itu akan gagal jika lulus WaterCar kerana ia menjangkakan parameter Enjin.
Untuk menyelesaikan isu ini, adalah perlu untuk mengekalkan keserasian dalam parameter kaedah antara antara muka ibu bapa dan anak. Jika gelagat khas diperlukan untuk subkelas tertentu, adalah lebih baik untuk menentukan kaedah tambahan daripada mengatasi jenis parameter.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mengatasi Parameter Kaedah dengan Antara Muka Anak sebagai Parameter Baharu dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!