Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/07/2011, 15:54
Avatar de skywolker
skywolker
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 195
Antigüedad: 13 años, 6 meses
Puntos: 8
Pregunta Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no entiendo

No se como es que eta ejecutandose la sobre carga get si no esta siendo llamada por ningun lado lo unico que veo es que se ejecuta por que tengo etendido que funciona si es privada , quizas sea que al haber mas de un private se ejecuten mas de uno por si solo como algo automatico pero nose tio es una rayadera que no me cabe en la cabeza muestro el codigo::


Código PHP:
<?php
class PropertyTest {
    
/**  Localización de los datos sobrecargados.  */
    
private $data = array();

    
/**  La sobrecarga no se usa en propiedades declaradas.  */
    
public $declared 1;

    
/**  La sobre carga sólo funciona aquí al acceder desde fuera de la clase.  */
    
private $hidden 2;

    public function 
__set($name$value) {
        echo 
"Estableciendo '$name' a '$value'\n";
        
$this->data[$name] = $value;
    }

    public function 
__get($name) {
        echo 
"Consultando '$name'\n";
        if (
array_key_exists($name$this->data)) {
            return 
$this->data[$name];
        }

        
$trace debug_backtrace();
        
trigger_error(
            
'Propiedad indefinida mediante __get(): ' $name .
            
' en ' $trace[0]['file'] .
            
' en la línea ' $trace[0]['line'],
            
E_USER_NOTICE);
        return 
null;
    }

    
/**  Desde PHP 5.1.0  */
    
public function __isset($name) {
        echo 
"¿Está definido '$name'?\n";
        return isset(
$this->data[$name]);
    }

    
/**  Desde PHP 5.1.0  */
    
public function __unset($name) {
        echo 
"Eliminando '$name'\n";
        unset(
$this->data[$name]);
    }

    
/**  No es un método mágico, esta aquí para completar el ejemplo.  */
    
public function getHidden() {
        return 
$this->hidden;
    }
}


echo 
"<pre>\n";

$obj = new PropertyTest;

$obj->1;
echo 
$obj->"\n\n";

var_dump(isset($obj->a));
unset(
$obj->a);
var_dump(isset($obj->a));
echo 
"\n";

echo 
$obj->declared "\n\n";

echo 
"Vamos a probar con la propiedad privada que se llama 'hidden':\n";
echo 
"Las propiedades privadas pueden consultarse en la clase, por lo que no se usa __get()...\n";
echo 
$obj->getHidden() . "\n";
echo 
"Las propiedades privadas no son visibles fuera de la clase, por lo que se usa __get()...\n";
echo 
$obj->hidden "\n";
?>

este es el resultado que debuelbe como podran ver __get debuelbe si ser utilizada de ninguna manera muy extraño no comprendo en absoluto lo que ocurre:

resultado

Cita:
Estableciendo 'a' a '1'
Consultando 'a'
1

¿Está definido 'a'?
bool(true)
Eliminando 'a'
¿Está definido 'a'?
bool(false)

1

Vamos a probar con la propiedad privada que se llama 'hidden':
Las propiedades privadas pueden consultarse en la clase, por lo que no se usa __get()...
2
Las propiedades privadas no son visibles fuera de la clase, por lo que se usa __get()...
Consultando 'hidden'


Notice: Propiedad indefinida mediante __get(): hidden en <file> en la línea 69 in <file>en la línea 28
esta parte se ejecuta si hay problemas osea cuando estas llamando el private fuera de la clase es extremadamente raro:

responsable:

Código PHP:

 
public function __get($name) {
        echo 
"Consultando '$name'\n";
        if (
array_key_exists($name$this->data)) {
            return 
$this->data[$name];
        }

        
$trace debug_backtrace();
        
trigger_error(
            
'Propiedad indefinida mediante __get(): ' $name .
            
' en ' $trace[0]['file'] .
            
' en la línea ' $trace[0]['line'],
            
E_USER_NOTICE);
        return 
null;
    }