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, 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
dan private
anggota 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 Grandpas
dan 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
, protected
dan private
masing - masing. Anda tahu betul itu protected
dan private
anggota 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, private
dan protected
anggota 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_export
dan var_dump
merupakan fungsi debugger . Mereka menyajikan informasi tentang variabel dalam bentuk yang dapat dibaca manusia. Tiga fungsi ini akan mengungkapkan protected
dan private
properti objek dengan PHP 5. Anggota kelas statis tidak akan ditampilkan.
Sumber lainnya: