Pertanyaan Apa perbedaan antara publik, pribadi, dan terlindungi?


Kapan dan mengapa saya harus menggunakannya public, private, dan protected fungsi dan variabel di dalam kelas? Apa perbedaannya?

Contoh:

// Public
public $variable;
public function doSomething() {
  // ...
}

// Private
private $variable;
private function doSomething() {
  // ...
}

// Protected
protected $variable;
protected function doSomething() {
  // ...
}

832
2017-12-05 22:13


asal


Jawaban:


Kau gunakan:

  • public ruang lingkup untuk membuat variabel / fungsi tersedia dari mana saja, kelas dan contoh lain dari objek.

  • private ruang lingkup ketika Anda ingin variabel / fungsi Anda terlihat hanya di kelasnya sendiri.

  • protected ruang lingkup saat Anda ingin membuat variabel / fungsi Anda terlihat di semua kelas yang memperpanjang kelas saat ini termasuk kelas induk.

Lebih: (Untuk informasi lengkap)


1080
2017-12-05 22:17



dd

Publik:

Ketika Anda menyatakan suatu metode (fungsi) atau properti (variabel) sebagai public, metode dan properti tersebut dapat diakses oleh:

  • Kelas yang sama yang mendeklarasikannya.
  • Kelas yang mewarisi kelas yang disebutkan 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 menyatakan suatu metode (fungsi) atau properti (variabel) sebagai protected, metode dan properti tersebut dapat diakses oleh

  • Kelas yang sama yang mendeklarasikannya.
  • Kelas yang mewarisi kelas yang disebutkan di atas.

Anggota luar tidak dapat mengakses variabel tersebut. "Orang luar" dalam arti bahwa mereka tidak contoh objek dari kelas yang dideklarasikan itu 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 yang tepat adalah ini:

PHP Fatal error: Tidak dapat mengakses properti yang dilindungi GrandPa :: $ name


Pribadi:

Ketika Anda menyatakan suatu 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 tersebut. Orang luar dalam pengertian bahwa mereka tidak contoh objek dari kelas yang dideklarasikan itu sendiri dan bahkan kelas-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:

Perhatikan: Properti tidak terdefinisi: Daddy :: $ 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 itu benar-benar kuat. Seperti yang telah saya nyatakan dalam tiga contoh di atas, protected dan private anggota (properti dan metode) tidak dapat diakses di luar kelas.

Namun, dengan refleksi Anda bisa melakukan itu luar biasa bahkan dengan mengakses protected dan private anggota di luar kelas!

Nah, apa itu refleksi?

Refleksi menambah kemampuan untuk mengubah kelas-kelas insinyur, antarmuka,   fungsi, metode dan ekstensi. Selain itu, mereka menawarkan cara untuk   mengambil komentar dokumen untuk fungsi, kelas, dan metode.

Pembukaan

Kami memiliki kelas bernama Grandpas dan mengatakan kami memiliki tiga properti. Untuk pemahaman yang mudah, pertimbangkan ada tiga grandpas dengan nama:

  • Mark Henry
  • John Clash
  • Will Jones

Mari kita buat mereka (tentukan pengubah) public, protected dan private masing-masing. Anda tahu betul itu protected dan private anggota tidak dapat diakses di luar kelas. Sekarang mari kita kontradiksi 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 Anda masih bisa lihat, itu private dan 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 debug

print_r, var_export dan var_dump adalah fungsi debugger. Mereka menyajikan informasi tentang variabel dalam bentuk yang dapat dibaca manusia. Ketiga fungsi ini akan mengungkapkan protected dan private properti objek dengan PHP 5. Anggota kelas statis akan tidak ditampilkan.


Lebih banyak sumber daya:



1015
2018-02-20 08:35



Ini 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 untuk antarmuka daripada implementasi" maka biasanya cukup mudah untuk membuat keputusan visibilitas. Secara umum, variabel harus bersifat pribadi atau dilindungi kecuali Anda memiliki alasan yang kuat untuk memaparkannya. Gunakan accessors publik (getter / setter) sebagai gantinya untuk membatasi dan mengatur akses ke internal kelas.

Untuk menggunakan mobil sebagai analogi, hal-hal seperti kecepatan, roda gigi, dan arah akan menjadi variabel instan. Anda tidak ingin pengemudi secara langsung memanipulasi hal-hal seperti rasio udara / bahan bakar. Sebaliknya, Anda mengekspos sejumlah tindakan terbatas sebagai metode publik. Antarmuka ke mobil mungkin termasuk metode seperti accelerate(), deccelerate()/brake(), setGear(), turnLeft(), turnRight(), dll.

Pengemudi tidak tahu atau dia harus peduli bagaimana tindakan ini dilaksanakan oleh internal mobil, dan memperlihatkan fungsionalitas itu bisa berbahaya bagi pengemudi dan orang lain di jalan. Oleh karena itu praktik yang baik untuk merancang antarmuka publik dan merangkum data di balik antarmuka itu.

Pendekatan ini juga memungkinkan Anda untuk mengubah dan meningkatkan penerapan metode publik di kelas Anda tanpa melanggar kontrak antarmuka dengan kode klien. Misalnya, Anda dapat meningkatkan accelerate() metode agar lebih efisien bahan bakar, namun penggunaan metode itu akan tetap sama; kode klien tidak akan memerlukan perubahan tetapi masih memperoleh manfaat dari peningkatan efisiensi Anda.

Edit: Karena tampaknya Anda masih berada di tengah-tengah konsep berorientasi objek pembelajaran (yang jauh lebih sulit untuk dikuasai daripada sintaks bahasa apa pun), saya sangat sarankan mengambil salinan Objek, Pola, dan Praktik PHP oleh Matt Zandstra. Ini adalah buku yang pertama kali mengajari saya bagaimana untuk menggunakan OOP secara efektif, daripada hanya mengajarkan saya sintaks. Saya telah belajar sintaks tahun sebelumnya, tapi itu tidak berguna tanpa memahami "mengapa" dari OOP.


81
2017-09-03 20:17



pribadi - dapat diakses dari DALAM kelas saja

dilindungi - dapat diakses dari DALAM kelas dan kelas PENGASUHAN

publik - dapat diakses dari kode DI LUAR kelas juga

Ini berlaku untuk fungsi serta variabel.


69
2017-12-05 22:17



Perbedaannya adalah sebagai berikut:

Public :: Variabel atau metode publik dapat diakses langsung oleh pengguna kelas mana pun.

Protected :: Suatu 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 privat hanya dapat diakses secara internal dari kelas di mana ia didefinisikan. Ini berarti bahwa variabel atau metode pribadi tidak dapat dipanggil dari anak yang memperpanjang kelas.


23
2017-09-03 19:51



Lingkup Visibilitas dengan Contoh Abstrak :: Memudahkan Memahami

Visibilitas properti atau metode ini ditentukan oleh deklarasi pra-pengaturan dari salah satu dari tiga kata kunci (Publik, terlindungi dan pribadi)

Publik : Jika properti atau metode didefinisikan sebagai publik, itu berarti dapat diakses dan dimanipulasi oleh apa pun yang dapat merujuk ke objek.

  • Abstrak misalnya. Pikirkan lingkup keterlihatan publik sebagai "piknik umum" bahwa siapa pun bisa datang.

Dilindungi: ketika properti atau visibilitas metode ditetapkan untuk anggota yang dilindungi hanya dapat diakses dalam kelas itu sendiri dan oleh kelas yang diwariskan & mewarisi. (Warisan: - kelas dapat memiliki semua properti dan metode kelas lain).

  • Pikirkan sebagai lingkup keterlihatan yang terlindungi sebagai "Perusahaan piknik" di mana anggota perusahaan dan anggota keluarga mereka diizinkan untuk tidak menjadi publik. Ini pembatasan ruang lingkup yang paling umum.

Pribadi: Ketika properti atau visibilitas metode disetel ke pribadi, hanya kelas yang memiliki anggota pribadi dapat mengakses metode dan properti tersebut (Secara internal di dalam kelas), terlepas dari hubungan kelas apa pun di sana mungkin.

  • dengan analogi piknik berpikir sebagai "piknik perusahaan di mana hanya anggota perusahaan yang diizinkan" dalam piknik. bukan keluarga bukan masyarakat umum yang diizinkan.

15
2018-02-07 03:07



/**
 * 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


14
2017-10-03 11:01



️ Di sini adalah cara mudah untuk mengingat ruang lingkup public, protected dan private.

PUBLIC:

  • public lingkup: Sebuah variabel / fungsi publik tersedia untuk objek dan kelas lainnya.

PROTECTED:

  • protected scope: Sebuah variabel / fungsi yang dilindungi tersedia untuk semua kelas yang memperpanjang kelas saat ini.
  • Tidak! Objek tidak dapat mengakses ruang lingkup ini

PRIVATE:

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

Membaca Visibilitas dari suatu metode atau variabel pada PHP Manual.


8
2018-06-30 07:27



Menimbang 'kapan':
Saya cenderung menyatakan semuanya sebagai pribadi pada awalnya, jika saya tidak yakin. Alasannya adalah, bahwa biasanya jauh lebih mudah untuk mengubah metode pribadi publik daripada sebaliknya. Itu karena Anda setidaknya bisa memastikan bahwa metode pribadi belum digunakan di mana pun kecuali di kelas itu sendiri. Metode publik mungkin sudah digunakan di mana-mana, mungkin membutuhkan penulisan ulang ekstensif.

Memperbarui: saya pergi untuk default protected saat ini, karena saya telah menemukan bahwa itu cukup baik untuk enkapsulasi dan tidak mengganggu ketika saya memperpanjang kelas (yang saya coba hindari juga). Hanya jika saya memiliki alasan yang bagus untuk menggunakan dua lainnya, saya akan.

Alasan bagus untuk a private metode akan menjadi salah satu yang mengimplementasikan sesuatu yang melekat pada objek yang bahkan kelas yang diperluas tidak boleh berubah (alasan faktual, di samping enkapsulasi, seperti manajemen internal negara). Akhirnya, masih cukup mudah untuk melacak di mana a protected metode yang digunakan biasanya, jadi saya secara default protected sekarang. Mungkin tidak 100% objektif "di parit" pengalaman, saya akui.


8
2018-05-28 14:27