Publiczny:
Gdy deklarujesz metodę (funkcję) lub właściwość (zmienną) jako public
, do tych metod i właściwości można uzyskać dostęp poprzez:
- Ta sama klasa, która to zadeklarowała.
- Klasy, które dziedziczą wyżej zadeklarowaną klasę.
- Wszelkie obce elementy poza tą klasą również mogą uzyskać dostęp do tych rzeczy.
Przykład:
<?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'
Chroniony:
Gdy deklarujesz metodę (funkcję) lub właściwość (zmienną) jako protected
, dostęp do tych metod i właściwości można uzyskać za pomocą
- Ta sama klasa, która to zadeklarowała.
- Klasy, które dziedziczą wyżej zadeklarowaną klasę.
Członkowie z zewnątrz nie mogą uzyskać dostępu do tych zmiennych. „Osoby postronne” w tym sensie, że nie są obiektowymi instancjami samej deklarowanej klasy.
Przykład:
<?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
Dokładny błąd będzie następujący:
PHP Błąd krytyczny: nie można uzyskać dostępu do chronionej właściwości GrandPa :: $ name
Prywatny:
Gdy deklarujesz metodę (funkcję) lub właściwość (zmienną) jako private
, do tych metod i właściwości można uzyskać dostęp poprzez:
- Ta sama klasa, która to zadeklarowała.
Członkowie z zewnątrz nie mogą uzyskać dostępu do tych zmiennych. Osoby postronne w tym sensie, że nie są obiektowymi instancjami samej deklarowanej klasy, a nawet klas dziedziczących zadeklarowaną klasę.
Przykład:
<?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
Dokładne komunikaty o błędach to:
Uwaga: Niezdefiniowana właściwość: Tatuś :: $ nazwa
Błąd krytyczny: Nie można uzyskać dostępu do prywatnej własności GrandPa :: $ nazwa
Analiza sekcji dziadka za pomocą Refleksji
Ten temat nie jest tak naprawdę poza zakresem i dodam go tutaj, aby udowodnić, że refleksja jest naprawdę potężna. Tak jak to podano w powyżej trzech przykładów protected
i private
członków (właściwości i metody) nie są dostępne na zewnątrz klasy.
Jednak dzięki refleksji możesz zrobić coś niezwykłego , nawet uzyskując dostęp protected
i private
członków spoza klasy!
Czym jest odbicie?
Refleksja dodaje możliwość inżynierii wstecznej klas, interfejsów, funkcji, metod i rozszerzeń. Ponadto oferują sposoby pobierania komentarzy do funkcji, klas i metod.
Preambuła
Mamy klasę o nazwie Grandpas
i mówimy, że mamy trzy właściwości. Aby ułatwić zrozumienie, weź pod uwagę trzy dziadki o nazwach:
- Mark Henry
- John Clash
- Will Jones
Uczyńmy je (przydział modyfikatorów) public
, protected
i private
odpowiednio. Wiesz bardzo dobrze, że protected
do private
członków nie można uzyskać dostępu poza klasą. Sprzeczmy teraz z tym stwierdzeniem za pomocą refleksji.
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>";
}
Wynik:
#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
Wspólne nieporozumienia:
Proszę nie mylić z poniższym przykładem. Jak widać, do członków private
i protected
nie można uzyskać dostępu poza klasą bez użycia refleksji
<?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);
Wynik:
GrandPas Object
(
[name1] => Mark Henry
[name2:protected] => John Clash
[name3:GrandPas:private] => Will Jones
)
Funkcje debugowania
print_r
, var_export
I var_dump
to działa debugger . Prezentują informacje o zmiennej w formie czytelnej dla człowieka. Te trzy funkcje ujawnią protected
i private
właściwości obiektów w PHP 5. Członkowie klasy statycznej nie zostaną pokazani.
Więcej zasobów: