Clases y Objetos
PHP Manual

Visibilidad

La visibilidad de una propiedad o método se puede definir anteponiendo una de las palabras claves public, protected o private en la declaración. Miembros de clases declarados como public pueden ser accedidos de cualquier lado. Miembros declarados como protected, sólo de la clase misma, por herencia y clases parent. Aquellos definidos como private, únicamentede la clase que los definió.

Visibilidad de Propiedades

Las propiedades de clases deben ser definidas como public, private, o protected. Si se declaran usando var, serán definidas como public.

Ejemplo #1 Declaración de propiedades

<?php
/**
 * Definición de MyClass
 */
class MyClass
{
    public 
$public 'Public';
    protected 
$protected 'Protected';
    private 
$private 'Private';

    function 
printHello()
    {
        echo 
$this->public;
        echo 
$this->protected;
        echo 
$this->private;
    }
}

$obj = new MyClass();
echo 
$obj->public// Funciona
echo $obj->protected// Error Fatal
echo $obj->private// Error Fatal
$obj->printHello(); // Muestra Public, Protected y Private


/**
 * Definición de MyClass2
 */
class MyClass2 extends MyClass
{
    
// Se puede redeclarar los métodos public y protected, pero no el private
    
protected $protected 'Protected2';

    function 
printHello()
    {
        echo 
$this->public;
        echo 
$this->protected;
        echo 
$this->private;
    }
}

$obj2 = new MyClass2();
echo 
$obj2->public// Funciona
echo $obj2->private// Undefined
echo $obj2->protected// Error Fatal
$obj2->printHello(); // Muestra Public, Protected2, Undefined

?>

Nota: La forma de declaración de una variable de PHP 4 con la palabra clave var todavía es soportado (como un sinónimo de public) por razones de compatibilidad. En PHP 5 antes de 5.1.3, su uso genera un Warning E_STRICT.

Visibilidad de Métodos

Los métodos de clases pueden ser definidos como public, private, o protected. Aquellos declarados sin ninguna palabra clave de visibilidad explícita serán definidos como public.

Ejemplo #2 Declaración de métodos

<?php
/**
 * Definición de MyClass
 */
class MyClass
{
    
// Declaración de un constructor public
    
public function __construct() { }

    
// Declaración de un método public
    
public function MyPublic() { }

    
// Declaración de un método protected
    
protected function MyProtected() { }

    
// Declaración de un método private
    
private function MyPrivate() { }

    
// Esto es public
    
function Foo()
    {
        
$this->MyPublic();
        
$this->MyProtected();
        
$this->MyPrivate();
    }
}

$myclass = new MyClass;
$myclass->MyPublic(); // Funciona
$myclass->MyProtected(); // Error Fatal
$myclass->MyPrivate(); // Error Fatal
$myclass->Foo(); // Public, Protected y Private funcionan


/**
 * Definición de MyClass2
 */
class MyClass2 extends MyClass
{
    
// Esto es public
    
function Foo2()
    {
        
$this->MyPublic();
        
$this->MyProtected();
        
$this->MyPrivate(); // Error Fatal
    
}
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Funciona
$myclass2->Foo2(); // Public y Protected funcionan, pero Private no

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
?>

Visibilidad desde otros objetos

Los objetos del mismo tipo tendrán acceso a los miembros private y protected entre ellos aunque no sean de la misma instancia. Esto es porque los detalles específicos de implementación ya se conocen cuando se encuentra dentro de estos objetos.

Ejemplo #3 Accediendo a miembros private del mismo tipo de objeto

<?php
class Test
{
    private 
$foo;

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

    private function 
bar()
    {
        echo 
'Método private accedido.';
    }

    public function 
baz(Test $other)
    {
        
// Se puede cambiar la propiedad private:
        
$other->foo 'hola';
        
var_dump($other->foo);

        
// También se puede invocar al método private:
        
$other->bar();
    }
}

$test = new Test('test');

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

El resultado del ejemplo sería:

string(5) "hola"
Método private accedido.

Clases y Objetos
PHP Manual