Apa perbedaan antara publik, pribadi, dan dilindungi?

989

Kapan dan mengapa saya harus menggunakan public, privatedan protectedfungsi 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() {
  // ...
}
Adam
sumber
59
Saya pikir pertanyaan ini juga akan mendapat manfaat dari jawaban dengan contoh praktis penggunaan masing-masing, alih-alih memberikan definisi literal tentang apa yang dilakukan setiap kata kunci.
Matius
70
Saya benar-benar berpikir bahwa pertanyaan ini harus bersifat publik, bukan dilindungi.
dotancohen

Jawaban:

1261

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)

Sarfraz
sumber
79
protectedruang lingkup ketika Anda ingin membuat variabel / fungsi Anda terlihat di semua kelas yang memperluas kelas saat ini DAN kelas induknya .
Shahid
4
@ Shahid - Saya tidak mengerti maksud Anda. Setiap kelas yang memperluas kelas A juga memperluas kelas induk A, bukan?
JDelage
4
@JDelage - Silakan lihat tautanhttp://www.php.net/manual/en/language.oop5.visibility.php#109324
Shahid
4
@Growler Mengapa repot-repot menggunakan benda sama sekali?
J.Steve
27
@Growler, jawaban yang lebih bermanfaat adalah bahwa sebaiknya menyembunyikan sebanyak mungkin bagian dalam dari suatu objek. Dengan begitu kecil kemungkinannya untuk putus. Jika Anda membuat semuanya menjadi publik, maka programmer lain mungkin mengubah variabel yang Anda tidak ingin diubah oleh apa pun selain pekerjaan dalam objek Anda.
Bersantai Di Siprus
1176

DD

Publik:

Saat Anda mendeklarasikan metode (fungsi) atau properti (variabel) sebagai public, metode dan properti tersebut dapat diakses oleh:

  • Kelas yang sama yang mendeklarasikannya.
  • Kelas-kelas yang mewarisi kelas yang dinyatakan di atas.
  • Elemen asing apa pun di luar kelas ini juga dapat mengakses hal-hal itu.

Contoh:

<?php

class GrandPa
{
    public $name='Mark Henry';  // A public variable
}

class Daddy extends GrandPa // Inherited class
{
    function displayGrandPaName()
    {
        return $this->name; // The public variable will be available to the inherited class
    }

}

// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'

Terlindung:

Ketika Anda mendeklarasikan metode (fungsi) atau properti (variabel) sebagai protected , metode dan properti tersebut dapat diakses oleh

  • Kelas yang sama yang mendeklarasikannya.
  • Kelas-kelas yang mewarisi kelas yang dinyatakan di atas.

Anggota luar tidak dapat mengakses variabel-variabel itu. "Orang luar" dalam arti bahwa mereka bukan objek contoh dari kelas yang dideklarasikan sendiri.

Contoh:

<?php

class GrandPa
{
    protected $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Kesalahan tepatnya adalah ini:

Kesalahan PHP fatal: Tidak dapat mengakses properti yang dilindungi GrandPa :: $ name


Pribadi:

Saat Anda mendeklarasikan metode (fungsi) atau properti (variabel) sebagai private, metode dan properti tersebut dapat diakses oleh:

  • Kelas yang sama yang mendeklarasikannya.

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:

<?php

class GrandPa
{
    private $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice 

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Pesan kesalahan yang tepat adalah:

Pemberitahuan: Properti
tidak terdefinisi : Ayah :: $ name Kesalahan fatal: Tidak dapat mengakses properti pribadi GrandPa :: $ name


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, protecteddanprivate anggota (properti dan metode) tidak dapat diakses di luar kelas.

Namun, dengan refleksi Anda dapat melakukan hal yang luar biasa dengan bahkan mengakses protecteddan privateanggota di luar kelas!

Nah, apa itu refleksi?

Reflection menambahkan kemampuan untuk merekayasa balik kelas, antarmuka, fungsi, metode, dan ekstensi. Selain itu, mereka menawarkan cara untuk mengambil komentar dokumen untuk fungsi, kelas dan metode.

Pembukaan

Kami memiliki kelas bernama Grandpasdan mengatakan kami memiliki tiga properti. Untuk memudahkan pemahaman, pertimbangkan ada tiga kakek dengan nama:

  • Mark Henry
  • John Clash
  • Will Jones

Mari kita membuatnya (menetapkan pengubah) public, protecteddan privatemasing - masing. Anda tahu betul itu protecteddan privateanggota tidak dapat diakses di luar kelas. Sekarang mari kita kontradiksi dengan pernyataan menggunakan refleksi.

Kode

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected  modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}


# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;

# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

echo "<br>";

#Scenario 2: Using reflection

$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)


echo "#Scenario 2: With reflection<br>";
echo "Printing members the 'reflect' way..<br>";

foreach($granpaNames as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

Keluaran:

#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1

#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3

Kesalahpahaman umum:

Tolong jangan bingung dengan contoh di bawah ini. Seperti yang masih dapat Anda lihat, privatedan protectedanggota tidak dapat diakses di luar kelas tanpa menggunakan refleksi

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}

$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);

Keluaran:

GrandPas Object
(
    [name1] => Mark Henry
    [name2:protected] => John Clash
    [name3:GrandPas:private] => Will Jones
)

Fungsi debugging

print_r, var_exportdan var_dumpmerupakan fungsi debugger . Mereka menyajikan informasi tentang variabel dalam bentuk yang dapat dibaca manusia. Tiga fungsi ini akan mengungkapkan protecteddan privateproperti objek dengan PHP 5. Anggota kelas statis tidak akan ditampilkan.


Sumber lainnya:


Shankar Damodaran
sumber
permintaan maaf atas keterlambatan menambahkan obrolan ini. Bisakah Anda memberi tahu saya mengapa seseorang akan menggunakan ini? Anda telah menjelaskan dengan sempurna bagaimana mereka bekerja dll. Saya hanya ingin tahu manfaat dari penggunaan masing-masing. Terima kasih
JamesG
@ JamesG sedikit dijelaskan dalam komentar lain di atas. stackoverflow.com/questions/4361553/...
cjmling
Saya tidak tahu mengapa mungkin itu sedikit keluar dari pertanyaan ini tetapi tidak ada yang menyebutkan bahwa di PHP ada dua pengubah akses: abstrak dan final kata kunci ini hanya dapat digunakan untuk kelas PHP tetapi masih mengakses pengubah
bxN5
1
Saya sarankan Anda membaca penjelasan tentang abstraksi yang disediakan oleh Dhairya Lakhera di sini: stackoverflow.com/questions/2558559/… . Ini adalah tambahan yang sempurna untuk penjelasan Shankar Damodaran.
Julio Marchi
83

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(), dll

Pengemudi 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.

The Awnry Bear
sumber
3
Buku yang direkomendasikan dalam pengeditan posting ini benar-benar sangat bagus. Potongan saya sejauh ini terbukti cukup mencerahkan. Beberapa bab pertama menjawab sebagian besar pertanyaan saya yang berkaitan dengan kelas.
Yosia
Buku-buku yang memungkinkan saya untuk benar-benar memahami objek, tanpa membungkam pemikiran saya dengan detail yang tidak perlu, seperti contoh di Smalltalk, oleh David A Taylor, menjadi Teknologi Berorientasi Objek: Panduan Manajer dan Teknik Bisnis dengan Obyek Teechnology . Keduanya hanya 100 halaman, dan masing-masing cukup mudah dibaca dalam satu sore. Tentu saja, ada Pola Desain Gamma et al , meskipun pendekatan dasarnya dapat dengan mudah dijelaskan dengan 'subkelas apa yang ingin Anda variasikan'.
Patanjali
Analogi yang sangat bagus. Apakah Anda punya satu untuk yang dilindungi vs pribadi?
Jānis Elmeris
79

private - dapat diakses dari DALAM kelas saja

protected - Dapat diakses dari DALAM kelas dan kelas Warisan

public - dapat diakses dari kode di luar kelas juga

Ini berlaku untuk fungsi dan juga variabel.

Olaf
sumber
Tidak yakin apakah definisi yang dilindungi benar di sini, dari jawaban yang dipilih yang sebenarnya tampaknya, Terlindungi - Hanya dapat diakses dari kelas yang diturunkan dan seterusnya dan bukan dari kelas asli / induk. Mengatakan "DALAM kelas" bisa sedikit membingungkan.
pal4life
7
Saya kira tidak, sebenarnya sepertinya jawaban yang dipilih adalah yang membingungkan di sini. Lihat komentar Shahid. IMHO metode yang dilindungi dapat diakses dengan baik dari dalam kelas asli.
Olaf
dapatkah suatu kelas dapat mengakses publik kelas lain?
Serjas
1
@ Serjas: Tidak, hanya objek lain, kecuali metode / bidang statis.
DanMan
Saya tidak tahu apakah ini berlaku untuk semua bahasa pemrograman, tetapi dalam PHP properti / metode "terproteksi" dapat diakses baik di kelas yang dideklarasikan atau kelas yang mewarisi dari kelas yang mendefinisikan properti / metode.
John Slegers
25

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.

Matthew Watts
sumber
17

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.

  • Abstrak misalnya. Pikirkan ruang lingkup visibilitas publik sebagai "piknik publik" yang dapat dikunjungi siapa pun.

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).

  • Berpikirlah sebagai ruang lingkup visibilitas yang dilindungi sebagai "Piknik Perusahaan" di mana anggota perusahaan dan anggota keluarga mereka diizinkan bukan publik. Ini batasan ruang lingkup paling umum.

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.

  • dengan analogi piknik, pikirkan sebagai "piknik perusahaan di mana hanya anggota perusahaan yang diizinkan" dalam piknik. bukan keluarga dan masyarakat umum tidak diperbolehkan.
Suman KC
sumber
15
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

Diekstrak dari :

http://php.net/manual/en/language.oop5.visibility.php

Techie
sumber
12

⚡️ Ini adalah cara mudah untuk mengingat ruang lingkup public, protecteddan private.

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.
  • Tidak! Objek tidak dapat mengakses ruang lingkup ini

PRIVATE:

  • private ruang lingkup: Variabel / fungsi pribadi hanya terlihat di kelas saat ini di mana ia didefinisikan.
  • Tidak! Kelas yang memperluas kelas saat ini tidak dapat mengakses ruang lingkup ini.
  • Tidak! Objek tidak dapat mengakses ruang lingkup ini.

Baca Visibilitas metode atau variabel pada Manual PHP.

Ahmad Awais
sumber
9

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 protectedsaat 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 privatemetode 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 mana protectedmetode yang digunakan biasanya, jadi saya default untuk protectedsaat ini. Mungkin tidak 100% objektif "dalam parit" pengalaman, saya akui.

DanMan
sumber
3
Dengan pembaruan Anda: Bisakah Anda memperjelas bagaimana "cukup baik" dan "alasan bagus" berjalan bersama di sini? Misalnya, menggunakan privatemasih "cukup baik" untuk digunakan, tetapi Anda tidak menyarankan itu lagi meskipun alasan sebelumnya Anda memberikan suara seperti "alasan bagus" masih: enkapsulasi.
hakre
@akre: Alasan mengapa kita harus berusaha untuk enkapsulasi adalah untuk menghindari negara bocor ke dalam lingkup luar. protectedsudah melakukannya, tetapi Anda tetap fleksibel untuk ekstensi / warisan. Sekali lagi, kecuali Anda memiliki alasan yang kuat untuk membuatnya private.
DanMan
Mungkin itu adalah hal yang tidak kami setujui: protectedsebenarnya 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.
hakre
Saya tidak akan berdebat dengan poin keseluruhan Anda, karena itu cukup adil, tetapi protectedtidak 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 suatu protectedbidang daripada publicsatu.
DanMan
6

Manual PHP memiliki bacaan yang bagus tentang pertanyaan di sini .

Visibilitas properti atau metode dapat didefinisikan dengan mengawali deklarasi dengan kata kunci publik, dilindungi atau pribadi. Anggota kelas menyatakan publik dapat diakses di mana saja. Anggota yang dinyatakan dilindungi hanya dapat diakses di dalam kelas itu sendiri dan oleh kelas yang diwarisi dan orang tua. Anggota yang dideklarasikan sebagai pribadi hanya dapat diakses oleh kelas yang mendefinisikan anggota.

code_burgar
sumber
6

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:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

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 privatecenderung 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:

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

Pribadi : privateproperti sangat mirip dengan protectedproperti. Tetapi fitur / perbedaan yang membedakan adalah membuatnya privatemembuatnya 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):

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();
Andrew
sumber
4

Mereka ada di sana untuk memungkinkan berbagai tingkat enkapsulasi

Mchl
sumber
10
Anda mungkin bisa menyempurnakan ini sedikit.
Aaron Hall
4

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 induk

protected $familyWealth;

star18bit
sumber
3

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 publicatau protectedharus dianggap perubahan UTAMA.

  • Apa pun yang baru publicatau protectedharus (setidaknya) MINOR

  • Hanya yang baru / perubahan apa pun yang privatebisa menjadi PATCH

Jadi dalam hal mempertahankan kode, ada baiknya berhati-hati tentang hal-hal apa yang Anda buat publicatau protectedkarena ini adalah hal-hal yang Anda janjikan kepada pengguna Anda.

mcfedr
sumber
1

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.

  1. PUBLIK
  2. PRIBADI
  3. TERLINDUNG

Sekarang, mari kita lihat gambar berikut untuk memahami tingkat akses pengubah akses masukkan deskripsi gambar di sini

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

Mahedi Hasan Durjoy
sumber
1

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.

Nomadme
sumber
0

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.

Farzana Khan
sumber