Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/06/2008, 11:17
Avatar de Lord Kazuky
Lord Kazuky
 
Fecha de Ingreso: junio-2006
Ubicación: 7F.00.00.01
Mensajes: 123
Antigüedad: 18 años, 7 meses
Puntos: 5
Pregunta Visibilidad de Propiedades y Metodos

Saludos!

Revizando "php.net/manual" por una duda que tenia sobre visibilidad de las propiedades y metodos de un objeto, encontre un codigo que demuestra que en PHP es posible acceder a propiedades privadas de un objeto, desde otra instancia de la misma clase, a traves de un metodo de la misma clase.

El ejemplo (el cual modifique del original para hacer mas pruebas) hago una clase "Prueba" con una propiedad publica y otra privada

seria algo como el siguiente:

Código PHP:
class Prueba{
    
    private 
$privada;
    public 
$publica;
    
    function 
Prueba($privada$publica){
        
$this->privada $privada;
        
$this->publica $publica;
    }
    
    function 
mostrarActual(){
        echo(
"<br> valor Privado: ".$this->privada);
        echo(
" valor Publico: ".$this->publica);
    }
    
    function 
mostrarOtro($Obj){
        echo(
"<br> Otro valor Privado: ".$Obj->privada);
        echo(
" Otro valor Publico: ".$Obj->publica);
    }
    
    private function 
establecerDatos($privada$publica){
        
$this->privada $privada;
        
$this->publica $publica;
    }
    
    static function 
crearDDDDD(){
        
$x = new Prueba("Privado_CCCCC""Publico_CCCCC");
        
$x->establecerDatos("Privado_DDDDD""Publico_DDDDD");
        return 
$x;
    }
    
}

$a = new Prueba("Privado_AAAAA""Publico_AAAAA");
$b = new Prueba("Privado_BBBBB""Publico_BBBBB");

$a->mostrarActual(); 
// MUESTRA    valor Privado: Privado_AAAAA valor Publico: Publico_AAAAA

$b->mostrarActual(); 
// MUESTRA    valor Privado: Privado_BBBBB valor Publico: Publico_BBBBB

$b->mostrarOtro($a); 
// MUESTRA    Otro valor Privado: Privado_AAAAA Otro valor Publico: Publico_AAAAA

$a->mostrarOtro($b);
 
// MUESTRA    Otro valor Privado: Privado_BBBBB Otro valor Publico: Publico_BBBBB

Prueba::crearDDDDD()->mostrarActual(); 
// MUESTRA    valor Privado: Privado_DDDDD valor Publico: Publico_DDDDD

$a->establecerDatos("Privado_EEEEE""Publico_EEEEE"); 
// MUESTRA    Fatal error: Call to private method Prueba::establecerDatos() 
// Como se esperaba... 
Bueno la duda es si esto es correcto en la programacion orientada objetos y no rompe con los principios de encapsulamiento. Desconozco si esto es valido y si se puede hacer en otros lenguajes.

Gracias !!
__________________
Saludos.
"Cualquier tonto puede escribir código que un computador entiende. Los buenos programadores escriben código que los humanos pueden entender. ;)"