2011-04-08 24 views
5

Estoy un poco confundido acerca de este párrafo sobre la visibilidad de OO en PHP. Tenía curiosidad si alguien podría explicarme. ejemplos serían geniales! mi cerebro no está pensando claro.Visibilidad orientada a objetos php

http://www.php.net/manual/en/language.oop5.visibility.php

El primer párrafo dice

La visibilidad de una propiedad o un método se puede definir como prefijo la declaración con las palabras claves públicas, protegido o privado. Se puede acceder a los miembros de la clase declarados públicos en todas partes. Los miembros declarados protegidos solo se puede acceder dentro de la clase y heredados y padres clases. Los miembros declarados como privados solo pueden acceder a la clase que define el miembro.

¿cómo puede una clase de padres acceder a un miembro de la clase de niños?

Respuesta

5

Eso es como:

class A { 
    public function test() { 
     $b = new B; 
     echo $b->foo; 
    } 
} 

class B extends A { 
    protected $foo = 'bar'; 
} 

$a = new A; 
$a->test(); 
+1

Eso se ve tan mal. No es de extrañar PHP se pinta con el palo feo todo el tiempo ;-) – Phil

+0

@Phil Sí, si este patrón se recomienda o no es una historia diferente ... ;-) – deceze

+0

esto es increíble! haha – Sufendy

1

PHP es un lenguaje interpretado. Las propiedades se resuelven en tiempo de ejecución, no en la etapa de compilación. Y los modificadores de acceso solo se verifican cuando se accede a una propiedad.

No importa si se inyecta ad-hoc una propiedad nueva (no declarada) para que se vuelva pública, o si se declara una propiedad protegida en una clase heredada.

El private realmente solo afecta la accesibilidad desde el exterior. La resolución ->name en tiempo de ejecución funciona independientemente de eso. Y el tiempo de ejecución de PHP simplemente no prevé si la declaración de propiedad se realizó para la clase actual de instancias de objeto. (A diferencia de las declaraciones privadas).

1

alcance público: se puede acceder a la propiedad (método, variable, etc.) desde cualquier clase en cualquier archivo.

class Example { 
    public $foo; 
} 

$example = new Example; 
$example->foo = 3; // everything OK 

ámbito de aplicación privado: solo se puede acceder a la propiedad solo por la misma clase.

class Example { 
    private $foo; 
} 

class Child_Class extends Example { 

    public function some_method() 
    { 
     parent::foo = 3; // raises error 
    } 
} 

ámbito de aplicación protegido: solo se puede acceder a la propiedad por la misma clase o por otras clases que la amplíen.

class Example { 
    protected $foo; 
} 

class Child_Class extends Example { 

    public function some_method() 
    { 
     parent::foo = 3; // this is OK 
    } 
} 

Todo tiene que ver con una técnica llamada encapsulación, en el que no debe permitir que el estado o el comportamiento de un miembro de la clase que se cambien fuera de la clase. http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

Cuestiones relacionadas