Saya sedang membangun Kelas Pengguna untuk situs web baru saya, namun kali ini saya berpikir untuk membuatnya sedikit berbeda ...
C ++ , Java dan bahkan Ruby (dan mungkin bahasa pemrograman lain) mengizinkan penggunaan kelas bersarang / dalam di dalam kelas utama, yang memungkinkan kita membuat kode lebih berorientasi objek dan terorganisir.
Di PHP, saya ingin melakukan sesuatu seperti ini:
<?php
public class User {
public $userid;
public $username;
private $password;
public class UserProfile {
// some code here
}
private class UserHistory {
// some code here
}
}
?>
Apakah itu mungkin di PHP? Bagaimana saya bisa mencapainya?
MEMPERBARUI
Jika tidak mungkin, apakah versi PHP masa depan mungkin mendukung kelas bersarang?
User
, contoh:public class UserProfile extends User
danpublic class UserHestory extends User
.Jawaban:
Intro:
Kelas bertingkat berhubungan dengan kelas lain sedikit berbeda dari kelas luar. Mengambil Java sebagai contoh:
Kelas bertingkat non-statis memiliki akses ke anggota lain dari kelas yang melingkupi, meskipun mereka dideklarasikan sebagai pribadi. Selain itu, kelas bertingkat non-statis memerlukan instance dari kelas induk untuk dibuat.
Ada beberapa alasan kuat untuk menggunakannya:
Di PHP
Anda dapat memiliki perilaku serupa di PHP tanpa kelas bersarang.
Jika semua yang ingin Anda capai adalah struktur / organisasi, seperti Package.OuterClass.InnerClass, namespace PHP mungkin cukup. Anda bahkan dapat mendeklarasikan lebih dari satu namespace dalam file yang sama (meskipun, karena fitur autoloading standar, itu mungkin tidak disarankan).
Jika Anda ingin meniru karakteristik lain, seperti visibilitas anggota, dibutuhkan lebih banyak usaha.
Mendefinisikan kelas "paket"
Kasus penggunaan
Menguji
Keluaran:
CATATAN:
Saya benar-benar tidak berpikir mencoba meniru innerClasses di PHP adalah ide yang bagus. Menurut saya kodenya kurang bersih dan mudah dibaca. Selain itu, mungkin ada cara lain untuk mencapai hasil yang serupa dengan menggunakan pola yang sudah mapan seperti Pola Pengamat, Penghias atau Pola Komposisi. Kadang-kadang, warisan sederhana pun sudah cukup.
sumber
Kelas bersarang nyata dengan
public
/protected
/private
aksesibilitas diusulkan pada 2013 untuk PHP 5.6 sebagai RFC tetapi tidak berhasil (Belum ada pemungutan suara, tidak ada pembaruan sejak 2013 - pada 2016/12/29 ):https://wiki.php.net/rfc/nested_classes
Setidaknya, kelas anonim membuatnya menjadi PHP 7
https://wiki.php.net/rfc/anonymous_classes
Dari halaman RFC ini:
Jadi, kita mungkin mendapatkan kelas bersarang di beberapa versi mendatang, tapi itu belum diputuskan.
sumber
Anda tidak dapat melakukan ini di PHP. Namun, ada cara fungsional untuk melakukannya.
Untuk lebih jelasnya silakan periksa posting ini: Bagaimana melakukan kelas bersarang PHP atau metode bersarang?
Cara implementasi ini disebut antarmuka fasih: http://en.wikipedia.org/wiki/Fluent_interface
sumber
Sejak PHP versi 5.4 Anda dapat memaksa membuat objek dengan konstruktor pribadi melalui refleksi. Ini dapat digunakan untuk mensimulasikan kelas bertingkat Java. Kode contoh:
sumber
Sesuai komentar Xenon untuk jawaban Anıl Özselgin, kelas anonim telah diimplementasikan di PHP 7.0, yang sedekat mungkin dengan kelas bersarang seperti yang akan Anda dapatkan sekarang. Berikut adalah RFC yang relevan:
Kelas Bersarang (status: ditarik)
Kelas Anonim (status: diterapkan di PHP 7.0)
Contoh postingan asli, seperti inilah kode Anda akan terlihat:
Ini, bagaimanapun, datang dengan peringatan yang sangat buruk. Jika Anda menggunakan IDE seperti PHPStorm atau NetBeans, lalu menambahkan metode seperti ini ke
User
kelas:... selamat tinggal penyelesaian otomatis. Ini terjadi bahkan jika Anda membuat kode ke antarmuka (I di SOLID), menggunakan pola seperti ini:
Kecuali jika satu-satunya panggilan Anda
$this->profile
berasal dari__construct()
metode (atau metode apa pun$this->profile
yang didefinisikan) maka Anda tidak akan mendapatkan petunjuk jenis apa pun. Properti Anda pada dasarnya "tersembunyi" ke IDE Anda, membuat hidup menjadi sangat sulit jika Anda mengandalkan IDE Anda untuk pelengkapan otomatis, kode bau, dan pemfaktoran ulang.sumber
Anda tidak dapat melakukannya di PHP. PHP mendukung "include", tetapi Anda bahkan tidak dapat melakukannya di dalam definisi kelas. Tidak banyak pilihan bagus di sini.
Ini tidak menjawab pertanyaan Anda secara langsung, tetapi Anda mungkin tertarik dengan "Namespaces", \ syntax \ hacked \ on \ top \ PHP OOP yang sangat jelek: http://www.php.net/manual/en/language .namespaces.rationale.php
sumber
Itu menunggu pemungutan suara sebagai RFC https://wiki.php.net/rfc/anonymous_classes
sumber
Saya rasa saya menulis solusi elegan untuk masalah ini dengan menggunakan ruang nama. Dalam kasus saya, kelas dalam tidak perlu mengetahui kelas induknya (seperti kelas dalam statis di Jawa). Sebagai contoh saya membuat kelas yang disebut 'User' dan subclass yang disebut 'Type', digunakan sebagai referensi untuk jenis pengguna (ADMIN, LAINNYA) dalam contoh saya. Salam.
User.php (File kelas pengguna)
Using.php (Contoh bagaimana memanggil 'subclass')
sumber
Anda bisa, seperti ini, di PHP 7:
sumber
Letakkan setiap kelas ke dalam file terpisah dan "memerlukan" mereka.
User.php
ProfilPengguna.php
UserHistory.php
sumber