Público:
Cuando declara un método (función) o una propiedad (variable) como public
, se puede acceder a esos métodos y propiedades mediante:
- La misma clase que lo declaró.
- Las clases que heredan la clase declarada anterior.
- Cualquier elemento extraño fuera de esta clase también puede acceder a esas cosas.
Ejemplo:
<?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'
Protegido:
Cuando declara un método (función) o una propiedad (variable) como protected
, se puede acceder a esos métodos y propiedades
- La misma clase que lo declaró.
- Las clases que heredan la clase declarada anterior.
Los miembros externos no pueden acceder a esas variables. "Extraños" en el sentido de que no son instancias de objeto de la clase declarada.
Ejemplo:
<?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
El error exacto será este:
Error fatal de PHP: no se puede acceder a la propiedad protegida GrandPa :: $ name
Privado:
Cuando declara un método (función) o una propiedad (variable) como private
, se puede acceder a esos métodos y propiedades mediante:
- La misma clase que lo declaró.
Los miembros externos no pueden acceder a esas variables. Extraños en el sentido de que no son instancias de objeto de la clase declarada en sí misma e incluso las clases que heredan la clase declarada.
Ejemplo:
<?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
Los mensajes de error exactos serán:
Aviso: Propiedad
no definida : Daddy :: $ name Error grave: No se puede acceder a la propiedad privada GrandPa :: $ name
Diseccionando la clase del abuelo usando la reflexión
Este tema no está realmente fuera de alcance, y lo estoy agregando aquí solo para demostrar que la reflexión es realmente poderosa. Como había indicado en lo anterior tres ejemplos, protected
y private
los miembros (propiedades y métodos) no se puede acceder fuera de la clase.
¡Sin embargo, con la reflexión puedes hacer lo extraordinario incluso accediendo protected
y private
miembros fuera de la clase!
Bueno, ¿qué es la reflexión?
Reflection agrega la capacidad de realizar ingeniería inversa en clases, interfaces, funciones, métodos y extensiones. Además, ofrecen formas de recuperar comentarios de documentos para funciones, clases y métodos.
Preámbulo
Tenemos una clase llamada Grandpas
y decimos que tenemos tres propiedades. Para una fácil comprensión, considere que hay tres abuelos con nombres:
- Mark Henry
- John Clash
- Will Jones
Vamos a hacerlos (asignar modificadores) public
, protected
y private
respectivamente. Usted sabe muy bien que protected
y private
los miembros no se puede acceder fuera de la clase. Ahora vamos a contradecir la afirmación usando la reflexión.
El código
<?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>";
}
Salida:
#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
Conceptos erróneos comunes:
No confunda con el siguiente ejemplo. Como todavía puede ver, no se puede acceder a los miembros private
y fuera de la clase sin usar la reflexiónprotected
<?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);
Salida:
GrandPas Object
(
[name1] => Mark Henry
[name2:protected] => John Clash
[name3:GrandPas:private] => Will Jones
)
Funciones de depuración
print_r
, var_export
y var_dump
son funciones del depurador . Presentan información sobre una variable en una forma legible para humanos. Estas tres funciones revelarán las propiedades protected
y private
de los objetos con PHP 5. Los miembros de la clase estática no se mostrarán.
Más recursos: