Kapan dan mengapa saya harus menggunakan public
, private
dan protected
fungsi dan variabel di dalam kelas? Apa perbedaan di antara mereka?
Contoh:
// Public
public $variable;
public function doSomething() {
// ...
}
// Private
private $variable;
private function doSomething() {
// ...
}
// Protected
protected $variable;
protected function doSomething() {
// ...
}
Jawaban:
Kau gunakan:
public
ruang lingkup untuk membuat properti / metode itu tersedia dari mana saja, kelas lain dan instance objek.private
ruang lingkup ketika Anda ingin properti / metode Anda terlihat hanya di kelasnya sendiri.protected
ruang lingkup ketika Anda ingin membuat properti / metode Anda terlihat di semua kelas yang memperluas kelas saat ini termasuk kelas induk.Lebih lanjut: (Untuk informasi lengkap)
sumber
protected
ruang lingkup ketika Anda ingin membuat variabel / fungsi Anda terlihat di semua kelas yang memperluas kelas saat ini DAN kelas induknya .http://www.php.net/manual/en/language.oop5.visibility.php#109324
Publik:
Saat Anda mendeklarasikan metode (fungsi) atau properti (variabel) sebagai
public
, metode dan properti tersebut dapat diakses oleh:Contoh:
Terlindung:
Ketika Anda mendeklarasikan metode (fungsi) atau properti (variabel) sebagai
protected
, metode dan properti tersebut dapat diakses olehAnggota luar tidak dapat mengakses variabel-variabel itu. "Orang luar" dalam arti bahwa mereka bukan objek contoh dari kelas yang dideklarasikan sendiri.
Contoh:
Kesalahan tepatnya adalah ini:
Pribadi:
Saat Anda mendeklarasikan metode (fungsi) atau properti (variabel) sebagai
private
, metode dan properti tersebut dapat diakses oleh:Anggota luar tidak dapat mengakses variabel-variabel itu. Orang luar dalam arti bahwa mereka bukan objek contoh dari kelas yang dideklarasikan sendiri dan bahkan kelas itu mewarisi kelas yang dideklarasikan.
Contoh:
Pesan kesalahan yang tepat adalah:
Membedah Kelas Kakek menggunakan Refleksi
Subjek ini tidak benar-benar di luar jangkauan, dan saya menambahkannya di sini hanya untuk membuktikan bahwa refleksi sangat kuat. Seperti yang telah saya nyatakan dalam tiga contoh di atas,
protected
danprivate
anggota (properti dan metode) tidak dapat diakses di luar kelas.Namun, dengan refleksi Anda dapat melakukan hal yang luar biasa dengan bahkan mengakses
protected
danprivate
anggota di luar kelas!Nah, apa itu refleksi?
Pembukaan
Kami memiliki kelas bernama
Grandpas
dan mengatakan kami memiliki tiga properti. Untuk memudahkan pemahaman, pertimbangkan ada tiga kakek dengan nama:Mari kita membuatnya (menetapkan pengubah)
public
,protected
danprivate
masing - masing. Anda tahu betul ituprotected
danprivate
anggota tidak dapat diakses di luar kelas. Sekarang mari kita kontradiksi dengan pernyataan menggunakan refleksi.Kode
Keluaran:
Kesalahpahaman umum:
Tolong jangan bingung dengan contoh di bawah ini. Seperti yang masih dapat Anda lihat,
private
danprotected
anggota tidak dapat diakses di luar kelas tanpa menggunakan refleksiKeluaran:
Fungsi debugging
print_r
,var_export
danvar_dump
merupakan fungsi debugger . Mereka menyajikan informasi tentang variabel dalam bentuk yang dapat dibaca manusia. Tiga fungsi ini akan mengungkapkanprotected
danprivate
properti objek dengan PHP 5. Anggota kelas statis tidak akan ditampilkan.Sumber lainnya:
sumber
Biasanya dianggap praktik yang baik untuk default ke visibilitas terendah yang diperlukan karena ini mempromosikan enkapsulasi data dan desain antarmuka yang baik. Ketika mempertimbangkan variabel anggota dan visibilitas metode, pikirkan peran yang dimainkan anggota dalam interaksi dengan objek lain.
Jika Anda "kode ke antarmuka daripada implementasi" maka biasanya cukup mudah untuk membuat keputusan visibilitas. Secara umum, variabel harus pribadi atau dilindungi kecuali Anda memiliki alasan yang baik untuk mengeksposnya. Gunakan pengakses publik (getter / setter) sebagai gantinya untuk membatasi dan mengatur akses ke internal kelas.
Untuk menggunakan mobil sebagai analogi, hal-hal seperti kecepatan, gigi, dan arah akan menjadi variabel instance pribadi. Anda tidak ingin pengemudi memanipulasi hal-hal seperti rasio udara / bahan bakar secara langsung. Sebaliknya, Anda mengekspos sejumlah tindakan sebagai metode publik. Antarmuka untuk mobil mungkin termasuk metode seperti
accelerate()
,deccelerate()
/brake()
,setGear()
,turnLeft()
,turnRight()
, dllPengemudi tidak tahu atau tidak peduli bagaimana tindakan ini diterapkan oleh bagian dalam mobil, dan memperlihatkan bahwa fungsionalitas dapat berbahaya bagi pengemudi dan orang lain di jalan. Oleh karena itu praktik yang baik merancang antarmuka publik dan merangkum data di balik antarmuka itu.
Pendekatan ini juga memungkinkan Anda untuk mengubah dan meningkatkan implementasi metode publik di kelas Anda tanpa memutus kontrak antarmuka dengan kode klien. Misalnya, Anda dapat meningkatkan
accelerate()
metode agar lebih hemat bahan bakar, namun penggunaan metode itu akan tetap sama; kode klien tidak memerlukan perubahan tetapi masih menuai manfaat dari peningkatan efisiensi Anda.Sunting: Karena sepertinya Anda masih berada di tengah-tengah pembelajaran konsep berorientasi objek (yang jauh lebih sulit dikuasai daripada sintaksis bahasa mana pun), saya sangat merekomendasikan mengambil salinan Objek PHP, Pola, dan Praktek oleh Matt Zandstra. Ini adalah buku yang pertama kali mengajarkan saya bagaimana menggunakan OOP secara efektif, bukan hanya mengajari saya sintaks. Saya telah mempelajari sintaksis bertahun-tahun sebelumnya, tetapi itu tidak berguna tanpa memahami "mengapa" OOP.
sumber
private
- dapat diakses dari DALAM kelas sajaprotected
- Dapat diakses dari DALAM kelas dan kelas Warisanpublic
- dapat diakses dari kode di luar kelas jugaIni berlaku untuk fungsi dan juga variabel.
sumber
Perbedaannya adalah sebagai berikut:
Public
:: Variabel atau metode publik dapat diakses secara langsung oleh pengguna kelas mana pun.Protected
:: Variabel atau metode yang dilindungi tidak dapat diakses oleh pengguna kelas tetapi dapat diakses di dalam subkelas yang mewarisi dari kelas.Private
:: Variabel atau metode pribadi hanya dapat diakses secara internal dari kelas yang didefinisikan. Ini berarti bahwa variabel atau metode pribadi tidak dapat dipanggil dari anak yang memperluas kelas.sumber
Lingkup Visibilitas dengan Contoh Abstrak :: Memudahkan Pemahaman
Visibilitas properti atau metode ini didefinisikan oleh deklarasi pra-perbaiki salah satu dari tiga kata kunci (Publik, dilindungi, dan pribadi)
Publik : Jika properti atau metode didefinisikan sebagai publik, itu berarti ia dapat diakses dan dimanipulasi oleh apa pun yang dapat merujuk ke objek.
Dilindungi: ketika visibilitas properti atau metode diatur ke anggota yang dilindungi hanya dapat diakses di dalam kelas itu sendiri dan oleh kelas yang diwarisi & diwariskan. (Warisan: - kelas dapat memiliki semua properti dan metode kelas lain).
Pribadi: Ketika visibilitas properti atau metode diatur ke pribadi, hanya kelas yang memiliki anggota pribadi yang dapat mengakses metode dan properti tersebut (secara internal di dalam kelas), terlepas dari hubungan kelas apa pun yang mungkin ada.
sumber
Diekstrak dari :
http://php.net/manual/en/language.oop5.visibility.php
sumber
PUBLIC
:public
ruang lingkup: Variabel / fungsi publik tersedia untuk objek dan kelas lain.PROTECTED
:protected
ruang lingkup: Variabel / fungsi yang dilindungi tersedia untuk semua kelas yang memperluas kelas saat ini.PRIVATE
:private
ruang lingkup: Variabel / fungsi pribadi hanya terlihat di kelas saat ini di mana ia didefinisikan.Baca Visibilitas metode atau variabel pada Manual PHP.
sumber
Mempertimbangkan ' kapan ':
Saya cenderung menyatakan semuanya sebagai pribadi pada awalnya, jika saya tidak yakin. Alasannya, bahwa biasanya lebih mudah untuk mengubah metode privat menjadi publik daripada sebaliknya. Itu karena Anda setidaknya dapat memastikan bahwa metode pribadi tidak digunakan di mana pun kecuali di kelas itu sendiri. Metode publik mungkin sudah digunakan di mana-mana, mungkin membutuhkan penulisan ulang yang luas.
Pembaruan : saya menggunakan default
protected
saat ini, karena saya datang untuk menemukan bahwa itu cukup baik untuk enkapsulasi dan tidak menghalangi ketika saya memperluas kelas (yang saya coba hindari). Hanya jika saya memiliki alasan yang baik untuk menggunakan dua lainnya, saya akan melakukannya.Alasan yang baik untuk suatu
private
metode akan menjadi sesuatu yang mengimplementasikan sesuatu yang melekat pada objek yang bahkan kelas yang diperluas tidak boleh berubah (alasan faktual, selain enkapsulasi, seperti manajemen keadaan internal). Akhirnya, masih cukup mudah untuk melacak di manaprotected
metode yang digunakan biasanya, jadi saya default untukprotected
saat ini. Mungkin tidak 100% objektif "dalam parit" pengalaman, saya akui.sumber
private
masih "cukup baik" untuk digunakan, tetapi Anda tidak menyarankan itu lagi meskipun alasan sebelumnya Anda memberikan suara seperti "alasan bagus" masih: enkapsulasi.protected
sudah melakukannya, tetapi Anda tetap fleksibel untuk ekstensi / warisan. Sekali lagi, kecuali Anda memiliki alasan yang kuat untuk membuatnyaprivate
.protected
sebenarnya bocor ke luar lingkup dan sering kali menghalangi Anda karena mendukung keputusan desain yang buruk seperti secara implisit mendukung warisan sementara lebih baik mendukung komposisi. Itu sebabnya tetap menggunakan privat kecuali Anda memiliki persyaratan aktual untuk tidak sering kali merupakan cara yang lebih baik untuk mulai menulis kode. Ini juga akan mencegah untuk membuat keputusan desain terlalu dini sementara mereka sebenarnya belum dibutuhkan.protected
tidak bocor ke luar lingkup (kode yang memanggil / mengakses metode / bidang) tetapi hanya lingkup dalam (memperluas kelas). Ada perbedaan, sekecil mungkin bagi Anda. Jauh lebih mudah untuk melacak penggunaan suatuprotected
bidang daripadapublic
satu.Manual PHP memiliki bacaan yang bagus tentang pertanyaan di sini .
sumber
Bagi saya, ini adalah cara paling berguna untuk memahami ketiga tipe properti:
Publik : Gunakan ini ketika Anda OK dengan variabel ini secara langsung diakses dan diubah dari mana saja dalam kode Anda.
Contoh penggunaan dari luar kelas:
Dilindungi : Gunakan ini ketika Anda ingin memaksa programmer lain (dan diri Anda sendiri) untuk menggunakan getter / setter di luar kelas ketika mengakses dan mengatur variabel (tetapi Anda harus konsisten dan menggunakan getter dan setter di dalam kelas juga). Ini atau
private
cenderung menjadi cara default Anda harus mengatur semua properti kelas.Mengapa? Karena jika Anda memutuskan pada titik tertentu di masa depan (mungkin bahkan dalam 5 menit) bahwa Anda ingin memanipulasi nilai yang dikembalikan untuk properti itu atau melakukan sesuatu dengannya sebelum mendapatkan / menetapkan, Anda dapat melakukannya tanpa refactoring di mana pun Anda memiliki menggunakannya dalam proyek Anda.
Contoh penggunaan dari luar kelas:
Pribadi :
private
properti sangat mirip denganprotected
properti. Tetapi fitur / perbedaan yang membedakan adalah membuatnyaprivate
membuatnya tidak dapat diakses oleh kelas anak tanpa menggunakan pengambil atau penyetel kelas induk.Jadi pada dasarnya, jika Anda menggunakan getter dan setter untuk properti (atau jika itu hanya digunakan secara internal oleh kelas induk dan itu tidak dimaksudkan untuk dapat diakses di tempat lain) Anda mungkin juga bisa membuatnya
private
, hanya untuk mencegah siapa pun mencoba untuk menggunakannya secara langsung dan memperkenalkan bug .Contoh penggunaan di dalam kelas anak (yang memperpanjang MyObject):
sumber
Mereka ada di sana untuk memungkinkan berbagai tingkat enkapsulasi
sumber
Variabel dalam PHP diberikan dalam tiga jenis:
Publik: nilai-nilai dari tipe variabel ini tersedia di semua ruang lingkup dan meminta eksekusi kode Anda. menyatakan sebagai:
public $examTimeTable;
Pribadi: Nilai dari jenis variabel ini hanya tersedia hanya untuk kelas yang dimilikinya.
private $classRoomComputers;
Dilindungi: Nilai-nilai kelas ini hanya dan hanya tersedia ketika Access diberikan dalam bentuk warisan atau kelas anak mereka. umumnya digunakan
::
untuk memberikan akses oleh kelas indukprotected $familyWealth;
sumber
Menghidupkan kembali pertanyaan lama, tapi saya pikir cara yang bagus untuk memikirkan ini adalah dalam hal API yang Anda definisikan.
public
- Semua yang ditandai publik adalah bagian dari API yang akan digunakan dan diandalkan oleh siapa saja yang menggunakan kelas / antarmuka / lainnya.protected
- Jangan tertipu, ini juga bagian dari API! Orang-orang dapat membuat subkelas, memperluas kode Anda dan menggunakan apa pun yang ditandai dilindungi.private
- Properti dan metode pribadi dapat diubah sebanyak yang Anda suka. Tidak ada orang lain yang bisa menggunakan ini. Ini adalah satu-satunya hal yang dapat Anda ubah tanpa membuat perubahan yang melanggar.Atau dalam istilah Semver :
Perubahan apa pun
public
atauprotected
harus dianggap perubahan UTAMA.Apa pun yang baru
public
atauprotected
harus (setidaknya) MINORHanya yang baru / perubahan apa pun yang
private
bisa menjadi PATCHJadi dalam hal mempertahankan kode, ada baiknya berhati-hati tentang hal-hal apa yang Anda buat
public
atauprotected
karena ini adalah hal-hal yang Anda janjikan kepada pengguna Anda.sumber
Ketika kita mengikuti php berorientasi objek di proyek kita, kita harus mengikuti beberapa aturan untuk menggunakan pengubah akses di php. Hari ini kita akan belajar dengan jelas apa itu pengubah akses dan bagaimana kita dapat menggunakannya. Pengubah akses PHP digunakan untuk mengatur hak akses dengan kelas-kelas PHP dan anggotanya yang merupakan fungsi dan variabel yang didefinisikan dalam ruang lingkup kelas. Di php ada tiga cakupan untuk anggota kelas.
Sekarang, mari kita lihat gambar berikut untuk memahami tingkat akses pengubah akses
Sekarang, mari kita lihat daftar berikut untuk mengetahui tentang kemungkinan kata kunci PHP yang digunakan sebagai pengubah akses.
publik: - kelas atau anggotanya yang ditentukan dengan pengubah akses ini akan dapat diakses publik dari mana saja, bahkan dari luar ruang lingkup kelas.
pribadi: - anggota kelas dengan kata kunci ini akan diakses di dalam kelas itu sendiri. kami tidak dapat mengakses data pribadi dari subkelas. Ini melindungi anggota dari akses kelas luar.
protected: - sama seperti private, kecuali dengan mengizinkan subclass untuk mengakses anggota kelas super yang dilindungi.
Sekarang lihat tabel untuk memahami pengubah akses. Baca artikel lengkap pengubah akses php
sumber
Public
: adalah keadaan default ketika Anda mendeklarasikan variabel atau metode, dapat diakses oleh apa pun secara langsung ke objek.Protected
: Dapat diakses hanya di dalam objek dan subclass.Private
: Dapat dirujuk hanya di dalam objek, bukan subclass.sumber
Kata kunci yang disebutkan adalah pengubah akses dan membantu kami menerapkan Enkapsulasi (atau penyembunyian informasi). Mereka memberi tahu kompilator kelas mana yang harus memiliki akses ke bidang atau metode yang didefinisikan.
privat - Hanya kelas saat ini akan memiliki akses ke bidang atau metode.
protected - Hanya kelas dan subclass saat ini (dan kadang-kadang juga kelas paket yang sama) dari kelas ini yang akan memiliki akses ke bidang atau metode.
publik - Setiap kelas dapat merujuk ke bidang atau memanggil metode.
sumber