Público:
Quando você declara um método (função) ou uma propriedade (variável) como public
, esses métodos e propriedades podem ser acessados por:
- A mesma classe que o declarou.
- As classes que herdam a classe declarada acima.
- Quaisquer elementos estranhos fora desta classe também podem acessar essas coisas.
Exemplo:
<?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:
Quando você declara um método (função) ou uma propriedade (variável) como protected
, esses métodos e propriedades podem ser acessados por
- A mesma classe que o declarou.
- As classes que herdam a classe declarada acima.
Membros externos não podem acessar essas variáveis. "Estranhos" no sentido de que não são instâncias de objetos da própria classe declarada.
Exemplo:
<?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
O erro exato será este:
Erro fatal do PHP: Não é possível acessar a propriedade protegida GrandPa :: $ name
Privado:
Quando você declara um método (função) ou uma propriedade (variável) como private
, esses métodos e propriedades podem ser acessados por:
- A mesma classe que o declarou.
Membros externos não podem acessar essas variáveis. Pessoas de fora no sentido de que não são instâncias de objetos da própria classe declarada e nem mesmo as classes que herdam a classe declarada.
Exemplo:
<?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
As mensagens de erro exatas serão:
Aviso: Propriedade indefinida: Papai :: $ name
Erro fatal: Não é possível acessar a propriedade privada GrandPa :: $ name
Dissecando a Classe Vovô Usando Reflexão
Esse assunto não está realmente fora do escopo, e estou adicionando aqui apenas para provar que a reflexão é realmente poderosa. Como afirmei nos três exemplos acima, protected
e os private
membros (propriedades e métodos) não podem ser acessados fora da classe.
No entanto, com a reflexão, você pode fazer o extraordinário , mesmo acessando protected
e private
membros fora da classe!
Bem, o que é reflexão?
O Reflection adiciona a capacidade de fazer engenharia reversa de classes, interfaces, funções, métodos e extensões. Além disso, eles oferecem maneiras de recuperar comentários de documentos para funções, classes e métodos.
Preâmbulo
Temos uma classe nomeada Grandpas
e dizemos que temos três propriedades. Para facilitar o entendimento, considere que existem três vovôs com nomes:
- Mark Henry
- John Clash
- Will Jones
Vamos torná-los (modificadores atribuir) public
, protected
e private
respectivamente. Você sabe muito bem que protected
e private
membros não pode ser acessado fora da classe. Agora vamos contradizer a afirmação usando reflexão.
O 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>";
}
Resultado:
#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
Equívocos comuns:
Por favor, não confunda com o exemplo abaixo. Como você ainda pode ver, os membros private
e protected
não podem ser acessados fora da classe sem usar a reflexão
<?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);
Resultado:
GrandPas Object
(
[name1] => Mark Henry
[name2:protected] => John Clash
[name3:GrandPas:private] => Will Jones
)
Funções de depuração
print_r
, var_export
E var_dump
são funções do depurador . Eles apresentam informações sobre uma variável em uma forma legível por humanos. Essas três funções revelarão as propriedades protected
e private
dos objetos no PHP 5. Membros da classe estática não serão mostrados.
Mais recursos: