2010-01-11 19 views
6

Estoy usando la versión estable de PHP 5.3 y, a veces, me encuentro con comportamientos muy incoherentes. Por lo que sé en herencia, todos los atributos y métodos (privados, públicos y protegidos) en super clase se pasan clase infantil.Php Herencia

class Foo 
{ 
    private $_name = "foo"; 
} 
class Bar extends Foo 
{ 
    public function getName() 
    { 
     return $this->_name; 
    } 
} 
$o = new Bar(); 
echo $o->getName(); 

//Notice: Undefined property: Bar::$_name in ...\test.php on line 11 

Pero cuando el atributo Foo :: $ _ name se define como "público", no da error. PHP tiene reglas propias de OO ???

Gracias

Editar: Ahora todas las cosas son claras. En realidad estaba pensando en "herencia", se crea una nueva clase y hereda a todos los miembros independientemente de su antecesor. No sabía que las reglas de "acceso" y las reglas de herencia son las mismas.

Edición De acuerdo con sus comentarios este fragmento debe dar un error. Pero está funcionando.

class Foo 
{ 
    private $bar = "baz"; 

    public function getBar() 
    { 
     return $this->bar; 
    } 
} 

class Bar extends Foo 
{} 

$o = new Bar; 
echo $o->getBar();  //baz 
+1

No. Esas reglas son exactamente las mismas que en Java y C++ donde se tomó el modelo de objetos de PHP. – troelskn

+3

Dado que getBar() se define en la clase principal, puede acceder a la variable miembro privada. –

+0

return $ this-> bar; Aquí $ esto se refiere al objeto Bar y la clase Bar no tiene una variable $ bar. ¿Como puede ser? – jsonx

Respuesta

12

De PHP Manual:

La visibilidad de una propiedad o un método se puede definir como prefijo la declaración con las palabras clave public, protected o private. Se puede acceder a los miembros de la clase declarados public en todas partes. Se puede acceder a los miembros declarados protected solo dentro de la clase y por las clases heredadas y principales . Los miembros declarados como private solo pueden acceder a la clase que define el miembro.

class A 
{ 
    public $prop1;  // accessible from everywhere 
    protected $prop2; // accessible in this and child class 
    private $prop3; // accessible only in this class 
} 

Y no, esto no es diferente de otros lenguajes de aplicación de las mismas palabras clave.

En cuanto a su segunda edición y el fragmento de código:

No, esto no debe dar un error porque getBar() se hereda de Foo y Foo tiene visibilidad a $bar. Si getBar() se definió o sobrecargó en Bar, no funcionaría. Consulte http://codepad.org/rlSWx7SQ

+0

+1 por mostrar realmente la explicación – NateDSaint

3

Sus suposiciones no son correctas. Los miembros protegidos y públicos son 'pasados'. Los miembros privados no son. Que yo sepa, esto es típico para muchos lenguajes OOP.

1

Métodos y variables privados no se puede acceder a los métodos y variables por clases secundarias o externamente, solo por la propia clase. Use Protegido si desea que la variable sea accesible para el niño pero inaccesible para las clases externas.