Öffentlichkeit:
Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren public
, können Sie auf diese Methoden und Eigenschaften zugreifen:
- Dieselbe Klasse, die es deklariert hat.
- Die Klassen, die die oben deklarierte Klasse erben.
- Alle fremden Elemente außerhalb dieser Klasse können ebenfalls auf diese Dinge zugreifen.
Beispiel:
<?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'
Geschützt:
Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren protected
, können Sie auf diese Methoden und Eigenschaften zugreifen
- Dieselbe Klasse, die es deklariert hat.
- Die Klassen, die die oben deklarierte Klasse erben.
Outsider-Mitglieder können nicht auf diese Variablen zugreifen. "Außenseiter" in dem Sinne, dass sie keine Objektinstanzen der deklarierten Klasse selbst sind.
Beispiel:
<?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
Der genaue Fehler ist folgender:
Schwerwiegender PHP-Fehler: Zugriff auf die geschützte Eigenschaft GrandPa :: $ name nicht möglich
Privat:
Wenn Sie eine Methode (Funktion) oder eine Eigenschaft (Variable) als deklarieren private
, können Sie auf diese Methoden und Eigenschaften zugreifen:
- Dieselbe Klasse, die es deklariert hat.
Outsider-Mitglieder können nicht auf diese Variablen zugreifen. Außenseiter in dem Sinne, dass sie keine Objektinstanzen der deklarierten Klasse selbst und sogar der Klassen sind, die die deklarierte Klasse erben.
Beispiel:
<?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
Die genauen Fehlermeldungen lauten:
Hinweis: Undefinierte Eigenschaft: Daddy :: $ name
Schwerwiegender Fehler: Zugriff auf Privateigentum GrandPa :: $ name nicht möglich
Präparation der Opa-Klasse mit Reflexion
Dieses Thema ist nicht wirklich außerhalb des Rahmens, und ich füge es hier hinzu, um zu beweisen, dass Reflexion wirklich mächtig ist. Wie ich hatte drei oben genannten Beispiele in der angegeben ist , protected
und private
Mitglieder (Eigenschaften und Methoden) nicht außerhalb der Klasse zugegriffen werden.
Doch mit Reflexion können Sie das tun außerordentliche sogar um den Zugriff auf protected
und private
Mitglieder außerhalb der Klasse!
Was ist Reflexion?
Reflection bietet die Möglichkeit, Klassen, Schnittstellen, Funktionen, Methoden und Erweiterungen zurückzuentwickeln. Darüber hinaus bieten sie Möglichkeiten zum Abrufen von Dokumentkommentaren für Funktionen, Klassen und Methoden.
Präambel
Wir haben eine Klasse mit dem Namen Grandpas
und sagen, wir haben drei Eigenschaften. Betrachten Sie zum leichteren Verständnis drei Großväter mit Namen:
- Mark Henry
- John Clash
- Will Jones
Lassen Sie uns sie machen (assign Modifikatoren) public
, protected
und private
jeweils. Sie wissen sehr gut , dass protected
und private
Mitglieder können nicht außerhalb der Klasse zugegriffen werden. Widersprechen wir nun der Aussage durch Reflexion.
Der Code
<?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>";
}
Ausgabe:
#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
Häufige Missverständnisse:
Bitte verwechseln Sie nicht das folgende Beispiel. Wie Sie immer noch sehen können, können die Mitglieder private
und außerhalb der Klasse nicht ohne Reflektion protected
aufgerufen werden
<?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);
Ausgabe:
GrandPas Object
(
[name1] => Mark Henry
[name2:protected] => John Clash
[name3:GrandPas:private] => Will Jones
)
Debugging-Funktionen
print_r
, var_export
Und var_dump
sind Debugger Funktionen . Sie präsentieren Informationen über eine Variable in einer für Menschen lesbaren Form. Diese drei Funktionen zeigen die protected
und private
Eigenschaften von Objekten mit PHP 5. Statische Klassenmitglieder werden nicht angezeigt.
Mehr Ressourcen: