Classes e Objetos
PHP Manual

Visibilidade

A visibilidade de uma propriedade ou método pode ser definida prefixando a declaração com as palavras-chave: public, protected or private. Itens declarados como públicos podem ser acessados de qualquer lugar. Membros declarados como protegidos só podem ser acessados na classe declarante e suas classes herdeiras. Membros declarados como privados só podem ser acessados na classe que define o membro privado.

Visibilidade de propriedades

Propriedades de classes devem ser declarados como públicas, privadas ou protegidas. Se declarado com var a propriedade será definida como pública.

Exemplo #1 Declaração de propriedade

<?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ônimo para a palavra-chave public). Em versões do PHP anteriores ao 5.1.3, isso gerará um aviso do tipo E_STRICT.

Visibilidades de métodos

Métodos de classe podem ser definidos como público, privado ou protegido. Métodos sem qualquer declaração explícita serão definidos como público.

Exemplo #2 Declaração de método

<?php
/**
 * Define MinhaClasse
 */
class MinhaClasse
{
    
// Declara um construtor público
    
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
?>

Visibilidade de outros objetos

Objetos do mesmo tipo terão acesso a outros mementos privados e protegidos mesmo que não sejam da mesma instância. Isso acontece por que os detalhes específicos de implementação já são conhecidos dentro destes objetos.

Exemplo #3 Acessando membros privados entre objetos do mesmo tipo

<?php
class Test
{
    private 
$foo;

    public function 
__construct($foo)
    {
        
$this->foo $foo;
    }

    private function 
bar()
    {
        echo 
'Acessou o método privado.';
    }

    public function 
baz(Test $other)
    {
        
// Pode-se alterar a propriedade privada:
        
$other->foo 'hello';
        
var_dump($other->foo);

        
// Pode-se chamar método privado:
        
$other->bar();
    }
}

$test = new Test('test');

$test->baz(new Test('other'));
?>

O exemplo acima irá imprimir:

string(5) "hello"
Acessou o método privado.

Classes e Objetos
PHP Manual