2012-02-24 13 views
6

vi esto en el manual http://www.php.net/manual/en/language.oop5.visibility.php PHP programación orientada a objetos y no puedo sacarlo de mi cabeza por qué la salida no es: Foo Foo :: :: testPrivate testPublicPHP ejemplo la visibilidad programación orientada a objetos Manual - alguien puede explicarlo

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 
+1

Sugerencia: obtendrás el resultado deseado si cambias 'private' por' protected'. Lea sobre ambos modificadores de acceso. –

+0

revisa este hilo. La primera respuesta me ayuda mucho. http://stackoverflow.com/questions/12794290/php-manual-visibilty-example-confused – Sam

+0

Compruebe este hilo. La primera respuesta me ayuda mucho. http://stackoverflow.com/questions/12794290/php-manual-visibilty-example-confused – Sam

Respuesta

11

Todo se trata de la visibilidad de las variables/métodos.

Notarás que en la clase Bar, el método testPrivate() es private. Eso significa que SOLAMENTE puede acceder a ese método. Sin hijos.

Así que cuando Foo extiende Bar, y luego pide que ejecute el método test(), que hace dos cosas:

  1. Se reemplaza el método testPublic() porque es público y Foo tiene el derecho de anularlo con su propio versión.
  2. Llama a test()en Bar (desde test() solo existe en Bar()).

testPrivate() es no anulado, y es parte de la clase que tiene test(). Por lo tanto, se imprime Bar::testPrivate.
testPublic()es anulado, y es parte de la clase heredada. Por lo tanto, se imprime Foo::testPublic.

+0

Derecha. Gracias @rockerest por una explicación clara. –

+0

Pero si 'echo $ this-> testPrivate() 'dentro de' Foo: testPublic', se repetirá 'Foo :: testPrivate'. Por lo tanto, parece que se anuló cuando se lo llamó desde este contexto. ¡Ahora estoy confundido! – bfavaretto

+0

@bfavaretto Recuerde, '$ this' es una variable dinámica que hace referencia a la clase en la que se encuentra el código. Por lo tanto, al procesar' test() ',' $ this' hace referencia a la copia temporal de la clase 'Bar' (que le proporciona 'Bar :: testPrivate()'), pero '$ this' dentro de la clase' Foo' hará referencia a la clase 'Foo' (dándole' Foo :: testPrivate() '). – rockerest

1

En algunos casos, es fácil darse cuenta de que quiere un método privadoen la clasebar, pero también quiere que el clase Foo para acceder a ella.
¿Pero espera, es público o privado?
Aquí viene el modificador protegido.
Cuando un método es privado, solo la clase puede llamar al método.
Cuando un método es público, cualquiera puede llamarlo, como una fiesta gratis.
Cuando un método es protegido, la clase en sí puede llamarlo y también cualquiera que haya insertado este método (niños) podrá llamarlo como un método propio.

-1

He publicado la misma pregunta hace unos días ... porque este comportamiento tampoco era lógico para mí. $ esto siempre se refiere al objeto actual en el que se utiliza. En mi opinión, un ejemplo como este debería arrojar un error o advertencia o algo así. Porque en el ejemplo anterior, en realidad está accediendo a miembros privados: ¡SSS QUE SUPONÍA SER INACCESIBLE!

+1

No es una respuesta constructiva. Puedes dejar un comentario con algo constructivo y no una diatriba. –

Cuestiones relacionadas