Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Saya Tidak Boleh Mengatasi Parameter Kaedah dengan Antara Muka Anak sebagai Parameter Baharu dalam PHP?

Mengapa Saya Tidak Boleh Mengatasi Parameter Kaedah dengan Antara Muka Anak sebagai Parameter Baharu dalam PHP?

Barbara Streisand
Barbara Streisandasal
2024-11-06 08:47:02960semak imbas

Why Can't I Override Method Parameters with a Child Interface as a New Parameter in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn