Visibilidade

A visibilidade de uma propriedade ou método pode ser definida prefixando a declaração com as palavras-chave: 'public','protected' ou 'private'. Itens declarados como public podem ser acessados por todo mundo. Protected limita o acesso a classes herdadas (e para a classe que define o item). Private limita a visibilidade para apenas a classe que define o item.

Visibilidade dos membros

Membros de uma classe devem ser definidos com public, private, ou protected.

Exemplo 19-8. Declaração de Membros

<?php
/**
* Define MinhaClasse
*/
class MinhaClasse
{
    
public $publica = 'Public';
    
protected $protegida = 'Protected';
    
private $privada = 'Private';

    function
imprimeAlo()
    {
        echo
$this->publica;
        echo
$this->protegida;
        echo
$this->privada;
    }
}

$obj = new MinhaClasse();
echo
$obj->publica; // Funciona
echo $obj->protegida; // Erro Fatal
echo $obj->privada; // Erro Fatal
$obj->imprimeAlo(); // Mostra Public, Protected e Private


/**
* Define MinhaClasse2
*/
class MinhaClasse2 extends MinhaClasse
{
    
// Nós podemos redeclarar as propriedades públicas e protegidas mas não as privadas
    
protected $protegida = 'Protected2';

    function
imprimeAlo()
    {
        echo
$this->publica;
        echo
$this->protegida;
        echo
$this->privada;
    }
}

$obj2 = new MinhaClasse2();
echo
$obj2->publica; // Works
echo $obj2->privada; // Undefined
echo $obj2->protegida; // Fatal Error
$obj2->imprimeAlo(); // Mostra Public, Protected2, not Private

?>

Nota: O uso da declaração de variável com a palavra-chave var não é mais válida para objetos do PHP 5. Para compatibilidade, presumirá-se que uma variável declarada no php tenha visibilidade public, e um aviso E_STRICT será mostrado na tela.

Visibilidades de métodos

Métodos de classe devem ser definidos com public, private, ou protected. Métodos sem qualquer declaração são definidas como public.

Exemplo 19-9. Declaração de método

<?php
/**
* Define MinhaClasse
*/
class MinhaClasse
{
    
// Contrutores devem ser public
    
public function __construct() { }

    
// Declara um método public
    
public function MeuPublico() { }

    
// Declara um método protected
    
protected function MeuProtegido() { }

    
// Declara um método private
    
private function MeuPrivado() { }

    
// Esse é public
    
function Foo()
    {
        
$this->MeuPublico();
        
$this->MeuProtegido();
        
$this->MeuPrivado();
    }
}

$minhaclasse = new MinhaClasse;
$minhaclasse->MeuPublico(); // Funciona
$minhaclasse->MeuProtegido(); // Erro Fatal
$minhaclasse->MeuPrivado(); // Erro Fatal
$minhaclasse->Foo(); // Public, Protected e Private funcionam


/**
* Define MinhaClasse2
*/
class MinhaClasse2 extends MinhaClasse
{
    
// Esse é public
    
function Foo2()
    {
        
$this->MeuPublico();
        
$this->MeuProtegido();
        
$this->MeuPrivado(); // Erro Fatal
    
}
}

$minhaclasse2 = new MinhaClasse2;
$minhaclasse2->MeuPublico(); // Funciona
$minhaclasse2->Foo2(); // Public e Protected funcionam, Private não
?>