Jika saya memiliki beberapa kelas dengan fungsi yang saya perlukan tetapi ingin menyimpan secara terpisah untuk organisasi, dapatkah saya memperluas kelas untuk memiliki keduanya?
yaitu class a extends b extends c
sunting: Saya tahu cara memperluas kelas satu per satu, tetapi saya sedang mencari metode untuk langsung memperpanjang kelas menggunakan beberapa kelas dasar - AFAIK Anda tidak dapat melakukan ini dalam PHP tetapi harus ada cara di sekitarnya tanpa menggunakan class c extends b
,class b extends a
Jawaban:
Menjawab hasil edit Anda:
Jika Anda benar-benar ingin memalsukan banyak warisan, Anda dapat menggunakan fungsi ajaib __call ().
Ini jelek meskipun bekerja dari sudut pandang pengguna kelas A:
Mencetak "abcdef"
sumber
Anda tidak dapat memiliki kelas yang memperpanjang dua kelas dasar. Anda tidak bisa.
Namun Anda dapat memiliki hierarki sebagai berikut ...
dan seterusnya.
sumber
Anda dapat menggunakan ciri-ciri, yang, semoga, akan tersedia dari PHP 5.4.
Ciri adalah mekanisme untuk menggunakan kembali kode dalam bahasa pewarisan tunggal seperti PHP. Trait dimaksudkan untuk mengurangi beberapa batasan pewarisan tunggal dengan memungkinkan pengembang untuk menggunakan kembali set metode secara bebas di beberapa kelas independen yang hidup dalam hierarki kelas yang berbeda. Semantik dari kombinasi Ciri dan kelas didefinisikan dengan cara, yang mengurangi kompleksitas dan menghindari masalah khas yang terkait dengan pewarisan berganda dan Mixin.
Mereka dikenal karena potensi mereka dalam mendukung komposisi dan penggunaan kembali yang lebih baik, karenanya integrasi mereka dalam versi bahasa yang lebih baru seperti Perl 6, Squeak, Scala, Slate dan Fortress. Ciri juga telah porting ke Jawa dan C #.
Informasi lebih lanjut: https://wiki.php.net/rfc/traits
sumber
Kelas tidak hanya dimaksudkan sebagai kumpulan metode. Kelas seharusnya mewakili konsep abstrak, dengan kedua negara (bidang) dan perilaku (metode) yang mengubah negara. Menggunakan pewarisan hanya untuk mendapatkan beberapa perilaku yang diinginkan terdengar seperti desain OO yang buruk, dan justru alasan mengapa banyak bahasa melarang pewarisan berganda: untuk mencegah "pewarisan spaghetti", yaitu memperluas 3 kelas karena masing-masing memiliki metode yang Anda butuhkan, dan berakhir dengan kelas yang mewarisi 100 metode dan 20 bidang, namun hanya menggunakan 5 di antaranya.
sumber
Saya yakin ada rencana untuk menambahkan mix-in segera.
Tetapi sampai saat itu, pergilah dengan jawaban yang diterima. Anda bisa abstrak sedikit untuk membuat kelas "extended":
Perhatikan bahwa dalam model ini "OtherClass" dapat 'mengetahui' tentang $ foo. OtherClass perlu memiliki fungsi publik yang disebut "setExtendee" untuk mengatur hubungan ini. Kemudian, jika metode itu dipanggil dari $ foo, ia dapat mengakses $ foo secara internal. Namun, itu tidak akan mendapatkan akses ke metode / variabel pribadi / terlindungi seperti yang akan diperluas oleh kelas nyata.
sumber
Gunakan sifat sebagai kelas dasar. Kemudian gunakan di kelas induk. Perpanjang itu.
Lihat sekarang wanita bisnis yang secara logis mewarisi bisnis dan manusia;
sumber
BusinessWoman
sebagai gantiBusinessPerson
? Maka Anda dapat memiliki multi-warisan yang sebenarnya.sumber
Jawaban yang saat ini diterima oleh @Franck akan bekerja tetapi sebenarnya bukan multiple inheritance tetapi turunan anak dari kelas yang didefinisikan di luar ruang lingkup, juga terdapat
__call()
singkatan - pertimbangkan untuk menggunakan di$this->childInstance->method(args)
mana saja Anda memerlukan metode kelas ExternalClass di kelas "extended".Jawaban yang tepat
Tidak, Anda tidak dapat, masing-masing, tidak benar-benar, seperti yang dikatakan oleh kata kunci manual
extends
:Jawaban nyata
Namun seperti yang disarankan @adam dengan benar, ini TIDAK melarang Anda untuk menggunakan banyak pewarisan hierarki.
Anda BISA memperpanjang satu kelas, dengan yang lain dan yang lain dengan yang lain dan seterusnya ...
Contoh yang cukup sederhana untuk ini adalah:
Catatan penting
Seperti yang mungkin telah Anda perhatikan, Anda hanya dapat melakukan beberapa (2+) intehritance berdasarkan hierarki jika Anda memiliki kendali atas semua kelas yang termasuk dalam proses - itu artinya, Anda tidak dapat menerapkan solusi ini misalnya dengan kelas bawaan atau dengan kelas yang Anda miliki. tidak dapat mengedit - jika Anda ingin melakukan itu, Anda dibiarkan dengan solusi @Franck - instance anak.
... Dan akhirnya contoh dengan beberapa output:
Output yang mana
sumber
Saya telah membaca beberapa artikel yang mengecilkan warisan dalam proyek-proyek (tidak seperti perpustakaan / kerangka kerja), dan mendorong untuk memprogram antarmuka antarmuka, tidak menentang implementasi.
Mereka juga menganjurkan OO dengan komposisi: jika Anda memerlukan fungsi di kelas a dan b, buat c memiliki anggota / bidang seperti ini:
sumber
Warisan berganda tampaknya berfungsi pada level antarmuka. Saya membuat tes di php 5.6.1.
Ini adalah kode yang berfungsi:
Saya tidak berpikir itu mungkin, tapi saya menemukan kode sumber SwiftMailer, di kelas Swift_Transport_IoBuffer, yang memiliki definisi berikut:
Saya belum bermain dengannya, tapi saya pikir mungkin menarik untuk dibagikan.
sumber
Saya baru saja menyelesaikan masalah "multiple inheritance" saya dengan:
Dengan cara ini saya memiliki kekuatan untuk memanipulasi sesi di dalam SessionResponse yang meluas MyServiceResponsetype masih bisa menangani Session dengan sendirinya.
sumber
Jika Anda ingin memeriksa apakah suatu fungsi bersifat publik, lihat topik ini: https://stackoverflow.com/a/4160928/2226755
Dan gunakan metode call_user_func_array (...) untuk banyak atau tidak argumen.
Seperti ini :
sumber
Anda dapat melakukannya menggunakan Ciri-ciri di PHP yang diumumkan pada PHP 5.4
Ini adalah tutorial singkat untuk Anda, http://culttt.com/2014/06/25/php-traits/
sumber
PHP belum mendukung multiple class inheritance, namun ia mendukung multiple interface inheritance.
Lihat http://www.hudzilla.org/php/6_17_0.php untuk beberapa contoh.
sumber
PHP tidak mengizinkan banyak pewarisan, tetapi Anda dapat melakukannya dengan mengimplementasikan banyak antarmuka. Jika implementasinya "berat", berikan implementasi kerangka untuk setiap antarmuka dalam kelas yang terpisah. Kemudian, Anda bisa mendelegasikan semua kelas antarmuka ke implementasi kerangka ini melalui penahanan objek .
sumber
Tidak tahu persis apa yang ingin Anda capai, saya sarankan melihat kemungkinan mendesain ulang aplikasi Anda untuk menggunakan komposisi daripada warisan dalam kasus ini.
sumber
Gagasan yang selalu baik adalah membuat kelas induk, dengan fungsi ... yaitu menambahkan semua fungsi ini ke induk.
Dan "pindahkan" semua kelas yang menggunakan ini secara hierarkis ke bawah. Saya perlu - menulis ulang fungsi, yang spesifik.
sumber
Salah satu masalah PHP sebagai bahasa pemrograman adalah kenyataan bahwa Anda hanya dapat memiliki satu warisan. Ini berarti suatu kelas hanya dapat mewarisi dari satu kelas lain.
Namun, banyak waktu akan bermanfaat untuk mewarisi dari beberapa kelas. Misalnya, mungkin diinginkan untuk mewarisi metode dari beberapa kelas yang berbeda untuk mencegah duplikasi kode.
Masalah ini dapat menyebabkan kelas yang memiliki sejarah keluarga yang panjang tentang warisan yang seringkali tidak masuk akal.
Dalam PHP 5.4 fitur baru bahasa ditambahkan dikenal sebagai Ciri. Trait adalah jenis seperti Mixin karena memungkinkan Anda untuk mencampur kelas Trait menjadi kelas yang ada. Ini berarti Anda dapat mengurangi duplikasi kode dan mendapatkan manfaat sambil menghindari masalah pewarisan berganda.
Sifat
sumber
Ini bukan jawaban nyata, kami memiliki kelas duplikat
... tapi berhasil :)
kelas copy_B adalah salin semua kelas B
sekarang
sumber
kelas A meluas B {}
kelas B meluas C {}
Kemudian A telah memperpanjang B dan C
sumber
B
. Apa yang kita inginkan sebagian besar waktu adalah memiliki dua kelas yang tidak terkaitB
danC
(mungkin dari perpustakaan yang berbeda) dan secara simultan diwariskan olehA
, sehinggaA
berisi semuanya dari keduanyaB
danC
, tetapiB
tidak mengandung apa pun dariC
dan sebaliknya.