Forum und email

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.

Example#1 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, Undefined

?>

Nota: O uso da declaração de variável com a palavra-chave var ainda é suportada por razões de compatibilidade (como um sinônicom para a palavra-chave public). No PHP 5 antes do 5.1.3, seu uso geraria um aviso do tipo E_STRICT.

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.

Example#2 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

class Bar
{
    public function 
test() {
        
$this->testPrivate();
        
$this->testPublic();
    }

    public function 
testPublic() {
        echo 
"Bar::testPublic\n";
    }

    private function 
testPrivate() {
        echo 
"Bar::testPrivate\n";
    }
}

class 
Foo extends Bar
{
    public function 
testPublic() {
        echo 
"Foo::testPublic\n";
    }

    private function 
testPrivate() {
        echo 
"Foo::testPrivate\n";
    }
}

$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
                // Foo::testPublic
?>