Halka açık:
Bir yöntemi (işlevi) veya özelliği (değişkeni) olarak bildirdiğinizde public
, bu yöntemlere ve özelliklere şu yollarla erişilebilir:
- Bunu ilan edenle aynı sınıf.
- Yukarıda belirtilen sınıfı devralan sınıflar.
- Bu sınıfın dışındaki yabancı unsurlar da bunlara erişebilir.
Misal:
<?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'
Korumalı:
Bir yöntemi (işlevi) veya bir özelliği (değişkeni) olarak bildirdiğinizde protected
, bu yöntemlere ve özelliklere
- Bunu ilan edenle aynı sınıf.
- Yukarıda belirtilen sınıfı devralan sınıflar.
Yabancı üyeler bu değişkenlere erişemez. Beyan edilen sınıfın kendisinin nesne örnekleri olmamaları anlamında "yabancılar" .
Misal:
<?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
Kesin hata şu olacaktır:
PHP Önemli hata: Korumalı mülke erişilemiyor GrandPa :: $ name
Özel:
Bir yöntemi (işlevi) veya özelliği (değişkeni) olarak bildirdiğinizde private
, bu yöntemlere ve özelliklere şu yollarla erişilebilir:
- Bunu ilan edenle aynı sınıf.
Yabancı üyeler bu değişkenlere erişemez. Yabancıların beyan edilen sınıfın kendisinin ve hatta beyan edilen sınıfı miras alan sınıfların nesne örnekleri olmamaları anlamındadır .
Misal:
<?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
Kesin hata mesajları şöyle olacaktır:
Uyarı: Tanımsız özellik: Daddy :: $ name
Önemli hata: Özel mülke erişilemiyor GrandPa :: $ name
Yansıma Kullanarak Büyükbaba Sınıfını Kesme
Bu konu gerçekten kapsam dışı değil ve buraya sadece yansımanın gerçekten güçlü olduğunu kanıtlamak için ekliyorum. Yukarıdaki üç örnekte belirttiğim gibi, protected
veprivate
elemanlar (özellikler ve yöntemler) sınıfının dışında erişilemez.
Ancak, yansıma ile yapabileceğiniz olağanüstü bile erişerek protected
veprivate
sınıfının üyeleri dışında!
Ya yansıma nedir?
Yansıma sınıfları, arabirimleri, işlevleri, yöntemleri ve uzantıları tersine mühendislik becerisi ekler. Ayrıca, işlevler, sınıflar ve yöntemler için doktor yorumlarını almanın yollarını sunarlar.
önsöz
Adında bir sınıfımız var Grandpas
ve üç özelliğimiz olduğunu söylüyor. Kolay anlaşılması için, isimleri olan üç büyükbaba olduğunu düşünün:
- Mark Henry
- John Clash
- Will Jones
Bize bunları (atama değiştiriciler) yapalım public
, protected
ve private
sırasıyla. Çok iyi biliyorsunuz protected
ve private
üyelere sınıf dışında erişilemiyor. Şimdi ifade kullanarak yansıma ile çelişelim.
Kod
<?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>";
}
Çıktı:
#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
Yaygın yanlış anlamalar:
Lütfen aşağıdaki örnekle karıştırmayın. Hala görebileceğiniz gibi, private
ve protected
üyelerine yansıma kullanmadan sınıfın dışında erişilemiyor
<?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);
Çıktı:
GrandPas Object
(
[name1] => Mark Henry
[name2:protected] => John Clash
[name3:GrandPas:private] => Will Jones
)
Hata ayıklama işlevleri
print_r
, var_export
Ve var_dump
vardır ayıklayıcı fonksiyonları . Bir değişken hakkında insan tarafından okunabilir biçimde bilgi verirler. Bu üç fonksiyon gösterecek protected
ve private
PHP 5. Statik sınıf üyeleri ile nesnelerin özellikleri olacak değil gösterilir.
Daha fazla kaynak: