Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no entiendo

Estas en el tema de Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no entiendo en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 30/07/2011, 15:54
Avatar de skywolker  
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 195
Antigüedad: 12 años, 9 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;
    } 
  #2 (permalink)  
Antiguo 30/07/2011, 16:00
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años
Puntos: 322
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

Veo que sacaste el código del manual, pero.. Al menos leíste lo demás? Ahí está todo
Cita:
Se invoca a los métodos de sobrecarga cuando se interactúa con propiedades o métodos que no se han declarado o que no son visibles en el ámbito activo.
La variable 'a' no está definida en la clase y aún así intentas interactuar con ella, es por eso que se llama a __get()
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #3 (permalink)  
Antiguo 30/07/2011, 16:07
Avatar de skywolker  
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 195
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

que tiene que ver la variable 'a' con private $hidden = 2; <---

ni siquiera la function que ejecuta el privade hidden tiene la $name ni conserva ninguna relacion ni variable dentro de la funcion:

pruebas :

public function getHidden() {
return $this->hidden;
}

// si go sin etender por que esta interfiriendo el __get es super raro parece la policia.
  #4 (permalink)  
Antiguo 30/07/2011, 16:13
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años
Puntos: 322
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

No, no es eso. Y no tiene nada de raro en absoluto.
Ejemplo, sabes qué es un constructor? (__construct) Es una 'función' que se ejecuta al iniciar un nuevo objeto en una clase. No necesitas llamarlo para que se auto-ejecute.

Pues bien, la función __get se va a auto-ejecutar cuando se llamen a métodos/propiedades no definidas dentro de una clase.
La variable 'a' no existe en la clase, entonces, al intentar definirle un valor a una propiedad NO definida, se va a ejecutar __get porque esa es su función....

Te recomiendo leer el manual...

Saludos!
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #5 (permalink)  
Antiguo 30/07/2011, 16:24
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

si es privada es privada y no existe por fuera de la clase. __get intenta solucionarte eso pero como no le asignas nada sale ese error:

Código PHP:
Ver original
  1. echo $obj->hidden = 5;
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #6 (permalink)  
Antiguo 30/07/2011, 16:26
Avatar de skywolker  
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 195
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

su es como $(document).ready ( function(){
//corre
});

de javascript y __destructor //detiene y continua


Apenas lo entiendo pero saber que actua como el coonstrucor podria llevarme a compreder este __get rebelde , ojala lo comprenda grx


@andresdzphp

echo $obj->hidden = 5;



si pero dise tambien que las privadas no pueden ser llamadas fuera de clase como se muestra en el mensaje.


@andesdzphp gracias creo que asi lo entendere muy buena explicacion
  #7 (permalink)  
Antiguo 30/07/2011, 16:34
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

Cita:
Iniciado por skywolker Ver Mensaje
su es como $(document).ready ( function(){
//corre
});

de javascript y __destructor //detiene y continua


Apenas lo entiendo pero saber que actua como el coonstrucor podria llevarme a compreder este __get rebelde , ojala lo comprenda grx


@andresdzphp

echo $obj->hidden = 5;



si pero dise tambien que las privadas no pueden ser llamadas fuera de clase como se muestra en el mensaje.


@andesdzphp gracias creo que asi lo entendere muy buena explicacion
Si, no se pueden llamar por fuera de la clase, por eso entra al juego __get intenta crearte esa propiedad pero como no le asignas nada te sale ese error.

Sobre el constructor se ejecuta cuando se crea el objeto y el destructor cuando se deja de usar el objeto o se destruye el objeto con unset($objeto).
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #8 (permalink)  
Antiguo 30/07/2011, 16:40
Avatar de skywolker  
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 195
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

este poquito me gusto : o se destruye el objeto con unset($objeto).

pero te as molestado en etiquetarme y desirme cosas que ya sabia y que habia dicho = / jeje que gracia, pero muchas gracias lo etendi gracias.
  #9 (permalink)  
Antiguo 30/07/2011, 16:59
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

Cita:
Iniciado por skywolker Ver Mensaje
este poquito me gusto : o se destruye el objeto con unset($objeto).

pero te as molestado en etiquetarme y desirme cosas que ya sabia y que habia dicho = / jeje que gracia, pero muchas gracias lo etendi gracias.
Bueno en fin, se ejecuta __get porque si lo estas utilizando. Suerte amigo
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #10 (permalink)  
Antiguo 30/07/2011, 23:59
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

Precisamente, me parecen ridículos aquellos quienes siempre dicen "que comportamiento tan extraño el de ...", y "no entiendo porque hace esto si yo no le digo que ..." o "no entiendo por que me dice que hay error si ..." como siempre tratando de excusar lo que no es culpa del lenguaje.

Ningún lenguaje inventa cosas de la nada, ningún lenguaje imputa errores de programador, ningún lenguaje hace lo que no le digamos que haga.

Al final todos son errores humanos, de entendimiento y comprensión del lenguaje mismo.

Por mucho que intentemos explicarlo no vamos a llegar a nada, si los árboles impiden ver el bosque no es problema nuestro.

Todos pasamos por ahí, y aprendimos reflexionando.

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 31/07/2011, 10:17
Avatar de skywolker  
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 195
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

Gracias por el consejo muy bueno pero yo no sabia que un no entiendo seria causa de echarle la culpa alguien o a algo. xD
  #12 (permalink)  
Antiguo 31/07/2011, 16:33
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

Cita:
Iniciado por skywolker Ver Mensaje
Gracias por el consejo muy bueno pero yo no sabia que un no entiendo seria causa de echarle la culpa alguien o a algo. xD
Pues tan solo reflexiona el titulo de tu tema, ¿estas afirmando algo que ni siquiera sabes?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #13 (permalink)  
Antiguo 31/07/2011, 16:49
Avatar de skywolker  
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 195
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

pero estando en pregunta puede seguir siendo lo que dices creo estar preguntando aunque no tenga la interrogacion ¿Aun asi sigue siendo echar la culpa ?xD

Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no
  #14 (permalink)  
Antiguo 31/07/2011, 17:28
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

Pues yo la verdad que leo tu tema una y otra ves y no le veo la utilidad, no se que tiene de raro.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #15 (permalink)  
Antiguo 31/07/2011, 18:02
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

Hola,

Cita:
Iniciado por andresdzphp Ver Mensaje
si es privada es privada y no existe por fuera de la clase. __get intenta solucionarte eso ...
Exactamente, en la lista de propiedades públicas que expone la clase no existe la variable 'hidden' (puesto que es privada), así que usa la función mágica __get, es decir, como no lo encontró en la lista de propiedades simplemente lo resuelve como cualquier otro nombre que no existe.

Cita:
Iniciado por pateketrueke Ver Mensaje
... Ningún lenguaje inventa cosas de la nada, ningún lenguaje imputa errores de programador, ningún lenguaje hace lo que no le digamos que haga. ...
Creo que difiero un poco con ese concepto cuando hablamos de PHP, básicamente se llaman 'mágicas' porque hacen algo mágico, es decir, hacen algo que no es fácil incurrir en conclusiones exactas si no se sabe a ciencia cierta su funcionamiento. Aclaro que no digo que se invente cosas, simplemente que es difícil saberlo si no se conoce PHP profundamente.

Eso hace que el lenguaje sea hasta cierto punto más dinámico, lo cual muchos confunden con más fácil, eso desde mi punto de vista, hace el lenguaje ciertamente más dinámico pero más difícil y se presta a confusiones fácilmente, que es lo que le ha pasado a skywolker.

Sin incurrir en más detalles podría decir que PHP con el método mágico __get hace más confuso el lenguaje. ¿Que sucedería si un programador hace uso de la clase pero se le olvida que la variable se llama 'hidden' e inadvertidamente escribe en la propiedad 'hiden'?

$a->hiden = 5;
echo $a->hiden;

No se uso la variable privada hidden realmente, pero ese tipo de errores suele llevar unos cuantos minutos, sino más, de depuración. En otros lenguajes que no usa duck typing generaría un error de compilación puesto que la propiedad no existe o es 'private'.

Saludos,

ps:

Algo relacionado al tema:

Cita:
One issue with duck typing is that it forces the programmer to have a much wider understanding of the code he or she is working with at any given time. In a strongly and statically typed language that uses type hierarchies and parameter type checking, it's much harder to supply an unexpected object type to a class.
http://en.wikipedia.org/wiki/Duck_typing
  #16 (permalink)  
Antiguo 03/10/2016, 09:26
Avatar de skywolker  
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 195
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Como puede la sobrecarga __get ejecutarse sin ser utilizada es rarisimo no

Una imagen vale mas que mil palabras:

Código PHP:

<?php
// Declarar una clase simple
class TestClass
{
    public 
$foo;

    public function 
__construct($foo)
    {
        
$this->foo $foo;
    }

    public function 
__toString()
    {
        return 
$this->foo;
    }
}

$class = new TestClass('Hola Mundo');//Esta parte que encierra la clase el Hola Mundo  get y set 
echo $class;
?>

Solucionado.

Etiquetas: sobrecarga
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:35.