2009-11-22 9 views
6

¿Debe el método de un objeto acceder a una propiedad protegida de otro objeto de la misma clase?Método de acceso a la propiedad protegida de otro objeto de la misma clase

Estoy codificando en PHP, y acabo de descubrir que se permite el acceso a la propiedad protegida de un objeto mediante un método de la misma clase, incluso si no es del mismo objeto.

En el ejemplo, al principio, obtendrá "3" en la salida, ya que la función readOtherUser habrá accedido correctamente al valor, y luego se producirá un error fatal de PHP, ya que el programa principal habrá fallado accediendo al mismo valor

<?php 

class user 
{ 
protected $property = 3; 

public function readOtherUser() 
{ 
    $otherUser = new user(); 
    print $otherUser->property; 
} 
} 

$user = new user(); 

$user->readOtherUser(); 
print $user->property; 

?>

Es esto un error de PHP o es el comportamiento previsto (y voy a tener que volver a aprender este concepto ... :)) (y hay referencias al hecho)? ¿Cómo se hace en otros lenguajes de programación?

Gracias!

+1

NB. Ruby's ['private'] (http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html#s4) se comporta como se describe: no se puede llamar a un método privado en una instancia diferente. – outis

Respuesta

6

Esto está destinado. Incluso es posible acceder a los miembros privados de la misma clase. Por lo tanto, piense en los modificadores como modificadores de clase, no como modificadores de objetos.

PHP no es el único idioma que tiene esta función. Java, por ejemplo, tiene esto también.

2

Comportamiento previsto. Una variable o función protegida significa que se puede acceder por la misma clase o cualquier clase que herede de esa clase. Un método protegido solo puede invocarse desde dentro de la clase, p. no puede llamarlo así:

$object = new MyClass(); 
$object->myProtectedFunction(); 

Esto le dará un error. Sin embargo, desde dentro de la clase definida 'MyClass', puede llamar perfectamente a la función protegida.

Lo mismo aplica para variabeles. Resumido:

use PROTECTED on variables and functions when: 
1. outside-code SHOULD NOT access this property or function. 
2. extending classes SHOULD inherit this property or function. 
Cuestiones relacionadas