Pubblico:
Quando si dichiara un metodo (funzione) o una proprietà (variabile) come public
, è possibile accedere a tali metodi e proprietà tramite:
- La stessa classe che l'ha dichiarato.
- Le classi che ereditano la classe dichiarata sopra.
- Anche qualsiasi elemento estraneo al di fuori di questa classe può accedere a tali elementi.
Esempio:
<?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'
protetto:
Quando si dichiara un metodo (funzione) o una proprietà (variabile) come protected
, è possibile accedere a tali metodi e proprietà
- La stessa classe che l'ha dichiarato.
- Le classi che ereditano la classe dichiarata sopra.
I membri esterni non possono accedere a tali variabili. "Outsiders", nel senso che non sono istanze oggetto della stessa classe dichiarata.
Esempio:
<?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
L'errore esatto sarà questo:
Errore irreversibile PHP: impossibile accedere alla proprietà protetta GrandPa :: $ name
Privato:
Quando si dichiara un metodo (funzione) o una proprietà (variabile) come private
, è possibile accedere a tali metodi e proprietà tramite:
- La stessa classe che l'ha dichiarato.
I membri esterni non possono accedere a tali variabili. Gli outsider nel senso che non sono istanze di oggetto della classe dichiarata stessa e neppure le classi che ereditano la classe dichiarata.
Esempio:
<?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
I messaggi di errore esatti saranno:
Avviso: Proprietà
non definita : Daddy :: $ name Errore irreversibile: Impossibile accedere alla proprietà privata GrandPa :: $ name
Analizzare la classe del nonno usando Reflection
Questo argomento non è davvero fuori dal campo di applicazione e lo sto aggiungendo qui solo per dimostrare che la riflessione è davvero potente. Come avevo affermato nei tre esempi precedenti, protected
eprivate
membri (proprietà e metodi) non è possibile accedere al di fuori della classe.
Tuttavia, con la riflessione puoi fare qualcosa di straordinario accedendo protected
eprivate
membri al di fuori della classe!
Bene, cos'è la riflessione?
Reflection aggiunge la possibilità di decodificare classi, interfacce, funzioni, metodi ed estensioni. Inoltre, offrono modi per recuperare i commenti dei documenti per funzioni, classi e metodi.
Preambolo
Abbiamo una classe chiamata Grandpas
e diciamo che abbiamo tre proprietà. Per una facile comprensione, considera che ci sono tre nonni con nomi:
- Mark Henry
- John Clash
- Will Jones
Cerchiamo di loro (modificatori assegnare) facciamo public
, protected
e private
, rispettivamente. Lo sai benissimo che protected
eprivate
non è possibile accedere ai membri al di fuori della classe. Ora contraddiciamo l'affermazione usando la riflessione.
Il codice
<?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>";
}
Produzione:
#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
Idee sbagliate comuni:
Si prega di non confondere con l'esempio seguente. Come puoi ancora vedere, i membri private
e protected
non sono accessibili al di fuori della classe senza usare la riflessione
<?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);
Produzione:
GrandPas Object
(
[name1] => Mark Henry
[name2:protected] => John Clash
[name3:GrandPas:private] => Will Jones
)
Funzioni di debug
print_r
, var_export
E var_dump
sono le funzioni del debugger . Presentano informazioni su una variabile in una forma leggibile dall'uomo. Queste tre funzioni riveleranno le proprietà protected
e private
degli oggetti con PHP 5. I membri di classe statici non verranno mostrati.
Altre risorse: