Standar Ketat: Deklarasi childClass :: customMethod () harus kompatibel dengan parentClass :: customMethod ()
Apa kemungkinan penyebab kesalahan ini di PHP? Di mana saya dapat menemukan informasi tentang apa artinya menjadi kompatibel ?
php
methods
standards-compliance
waiwai933
sumber
sumber
function customMethod( ... )
untuk setiap fungsi kami dapat memberi tahu Anda masalah spesifiknyause Closure;
ke atas di kelas saya (karena petunjuk tipe ituClosure
). Jadi ... pastikan untuk memeriksa apakah Anda kehilangan dependensi seperti itu.Jawaban:
childClass::customMethod()
memiliki argumen yang berbeda, atau tingkat akses yang berbeda (publik / pribadi / dilindungi) dariparentClass::customMethod()
.sumber
parentClass::customMethod($thing = false)
danchildClass::customMethod($thing)
akan memicu kesalahan, karena metode anak belum menentukan nilai default untuk argumen pertama.&
) yang hilang dalam argumen juga dapat memicu kesalahan ini.Pesan ini berarti bahwa ada pemanggilan metode tertentu yang mungkin gagal pada saat run-time. Misalkan Anda punya
Kompilator hanya memeriksa panggilan $ a-> foo () terhadap persyaratan A :: foo () yang tidak memerlukan parameter. Namun $ a dapat menjadi objek kelas B yang membutuhkan parameter sehingga panggilan akan gagal saat runtime.
Namun ini tidak akan pernah gagal dan tidak memicu kesalahan
Jadi tidak ada metode yang memiliki lebih banyak parameter yang diperlukan selain metode induknya.
Pesan yang sama juga dihasilkan ketika petunjuk tipe tidak cocok, tetapi dalam kasus ini PHP bahkan lebih membatasi. Ini memberikan kesalahan:
seperti ini:
Itu tampaknya lebih ketat daripada yang seharusnya dan saya berasumsi itu karena internal.
Perbedaan visibilitas menyebabkan kesalahan yang berbeda, tetapi untuk alasan dasar yang sama. Tidak ada metode yang kurang terlihat dari metode induknya.
sumber
jika Anda ingin menyimpan formulir OOP tanpa mematikan kesalahan, Anda juga dapat:
sumber
func_get_args()
, yaitu, diB
,public function foo($a = null, $b = null, $c = null)
, karena hal ini tidak melanggar kontrak yang dijanjikan olehA
.Hanya untuk memperluas kesalahan ini dalam konteks antarmuka, jika Anda mengetik mengisyaratkan parameter fungsi Anda seperti:
antarmuka A
Kelas B
Jika Anda lupa untuk menyertakan
use
pernyataan pada kelas implementasi Anda (Kelas B), Anda juga akan mendapatkan kesalahan ini meskipun parameter metode identik.sumber
Saya menghadapi masalah ini saat mencoba memperluas kelas yang ada dari GitHub. Saya akan mencoba menjelaskan diri saya sendiri, pertama menulis kelas sebagaimana saya seharusnya, dan kemudian kelas seperti sekarang.
Apa yang saya pikirkan
Apa yang akhirnya saya lakukan
Jadi tampaknya errror ini muncul juga saat Anda menggunakan metode yang mengembalikan kelas dengan namespace, dan Anda mencoba mengembalikan kelas yang sama tetapi dengan namespace lain. Untungnya saya telah menemukan solusi ini, tetapi saya tidak sepenuhnya memahami manfaat dari fitur ini di php 7.2, bagi saya itu normal untuk menulis ulang metode kelas yang ada saat Anda membutuhkannya, termasuk redefinisi parameter input dan / atau bahkan perilaku metode.
Satu kelemahan pendekatan sebelumnya, adalah bahwa IDE tidak dapat mengenali metode baru yang diterapkan di \ mycompany \ CutreApi \ ClassOfVendor (). Jadi, untuk saat ini, saya akan melakukan implementasi ini.
Saat ini selesai
Jadi, alih-alih mencoba menggunakan metode "terserah", saya menulis metode baru yang disebut "getWhatever". Faktanya keduanya melakukan hal yang sama, hanya mengembalikan kelas, tetapi dengan ruang nama yang berbeda seperti yang saya jelaskan sebelumnya.
Semoga ini bisa membantu seseorang.
sumber