Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

[SOLUCIONADO] PHP OO function "magic" __get

Estas en el tema de function "magic" __get en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Saludos a todos. ¿Alguien puede ayudarme con la funcion __get de una clase? He hecho algo parecido a lo que sigue: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: ...
  #1 (permalink)  
Antiguo 01/02/2013, 17:27
Avatar de smcicoss  
Fecha de Ingreso: febrero-2013
Ubicación: Asturias
Mensajes: 5
Antigüedad: 11 años, 9 meses
Puntos: 0
Pregunta function "magic" __get

Saludos a todos.
¿Alguien puede ayudarme con la funcion __get de una clase?

He hecho algo parecido a lo que sigue:
Código PHP:
Ver original
  1. <?php
  2.  
  3. class a{
  4.     public $va = "variable a de la clase a";
  5. }
  6.  
  7. class b extends a{
  8.     private $vb = "variable b de la clase b";
  9.  
  10.     public function __get($propiedad){
  11.         if($propiedad == "vb")
  12.             return $this->vb;
  13.         else
  14.             return null;
  15.     }
  16. }
  17.  
  18. $cb = new b;
  19. echo $cb->vb."<br />".$cb->va;

Según mi lógica $cb->va debería de devolver null. Sin embargo me devuelve el valor de la clase madre.
Estoy perdido.
  #2 (permalink)  
Antiguo 01/02/2013, 17:32
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: function "magic" __get

El "método mágico __get" se usa sólo cuando la propiedad no existe, pero si está definida desde la clase padre, entonces también existe en la clase actual; de hecho, eso es lo que hace extend, incluir todos los métodos y propiedades de la clase desde la cual estás extendiendo, teniendo la oportunidad de agregar más cosas.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 01/02/2013, 17:33
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: function "magic" __get

__get se dispara únicamente cuando se intenta acceder a propiedades inaccesibles que no es el caso de $va dado que es publica, cambia la visibilidad a protected o private y vuelve a comprobarlo.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 01/02/2013, 17:34
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: function "magic" __get

Cita:
Iniciado por smcicoss Ver Mensaje
Según mi lógica $cb->va debería de devolver null. Sin embargo me devuelve el valor de la clase madre.
Tu lógica no es suficiente, por favor, lee el manual.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 01/02/2013, 17:55
Avatar de smcicoss  
Fecha de Ingreso: febrero-2013
Ubicación: Asturias
Mensajes: 5
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: function "magic" __get

Gracias Triby. Se lo que me dices, pero precisamente pongo el control en la clase extendida para impedir el accedo a la propiedad de la clase padre y según entiendo, debería de pasar antes por el "__get" de la clase extendida que expresamente hace devolver null.
Ten en cuenta que esto es solo un ejemplo reducido.
  #6 (permalink)  
Antiguo 01/02/2013, 18:00
Avatar de smcicoss  
Fecha de Ingreso: febrero-2013
Ubicación: Asturias
Mensajes: 5
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: function "magic" __get

Sí, eso parece. Lo acabo de comprobar. El problema es que la clase padre es la mysqli y no la puedo modificar
Gracias.
  #7 (permalink)  
Antiguo 01/02/2013, 18:00
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: function "magic" __get

Cita:
Iniciado por smcicoss Ver Mensaje
[...] precisamente pongo el control en la clase extendida para impedir el accedo a la propiedad de la clase padre y según entiendo, debería de pasar antes por el "__get" de la clase extendida que expresamente hace devolver null.
Ten en cuenta que esto es solo un ejemplo reducido.
Por favor, lee el manual, ten en cuenta que existen restricciones al respecto de usar métodos mágicos.

Lo que estás buscando es en definitiva imposible bajo ese contexto, no hay más.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 01/02/2013, 18:03
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: function "magic" __get

Cita:
Iniciado por smcicoss Ver Mensaje
Gracias Triby. Se lo que me dices, pero precisamente pongo el control en la clase extendida para impedir el accedo a la propiedad de la clase padre
Eeep..he visto que quieres extender de una clase ya definida..Pues lo vas a tener complicado..Las clases derivadas no pueden restringir la visibilidad de metodos o miembros declarados en las clases padre..

Última edición por dashtrash; 01/02/2013 a las 18:13
  #9 (permalink)  
Antiguo 01/02/2013, 19:08
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: function "magic" __get

@smcicoss, si comentas algo mas sobre lo que quieres hacer o el porque talves se te pueda sugerir alguna estrategia, de todas formas, hay alguna razón en especial para no utilizar composition ?.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 01/02/2013, 21:30
Avatar de smcicoss  
Fecha de Ingreso: febrero-2013
Ubicación: Asturias
Mensajes: 5
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: function "magic" __get

Gracias masterpupet.

Desconozco lo que es "composition". ¿donde puedo documentarme sobre ello?

Provengo de otros lenguajes y, aunque sí consulto el manual, no he visto las restricciones que me apuntáis.
Creo que simplemente sabiéndolo podré encontrar otra forma.
Anteriormente había utilizado este método para encapsular el DOM y no tropecé con este problema.

Lo que pretendo, como era mi costumbre en C++, es encapsular el mysqli, especializándolo sobre una base de datos concreta. Suelo hacerlo en varias capas, añadiendo funcionalidad especifica y limitando el acceso directo a la base de datos, dándole así una mayor abstracción y seguridad, eliminando en cada nivel los detalles propios del manejo de MySQL.

Como, además, "gozo" de muy mala memoria me creo mis propios nombre en castellano y así logro centrarme mejor sobre el problema que me ocupa. (los años pasan factura)

Gracias a todos por vuestra ayuda.
  #11 (permalink)  
Antiguo 01/02/2013, 22:19
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: function "magic" __get

Te dejo una referencia a Object Composition y googleando un poco encontraras mucho material sobre el tema, de todas formas te dejo un pequeño ejemplo de a lo que me refiero.

Código PHP:
Ver original
  1. class Wrapper
  2. {
  3.     /**
  4.      * @var mysqli
  5.      */
  6.     private $mysqli;
  7.  
  8.     /**
  9.      * @param mysqli $mysqli
  10.      */
  11.     public function __construct(mysqli $mysqli)
  12.     {
  13.         $this->mysqli = $mysqli;
  14.     }
  15.  
  16.     /**
  17.      * @param  string $property
  18.      * @return mixed
  19.      */
  20.     public function __get($property)
  21.     {
  22.         if ('affected_rows' == $property) {
  23.             throw new DomainException('...');
  24.         }
  25.         if (!property_exists($this->mysqli, $property)) {
  26.             throw new RuntimeException('...');
  27.         }
  28.         return $this->mysqli->$property;
  29.     }
  30.  
  31.     /**
  32.      * @param  string $method
  33.      * @param  array  $params
  34.      * @return mixed
  35.      */
  36.     public function __call($method, $params)
  37.     {
  38.         return call_user_func_array(array($this->mysqli, $method), $params);
  39.     }
  40.        
  41.        ...
  42. }

uso

Código PHP:
Ver original
  1. $mysqli  = new mysqli('...');
  2. $wrapper = new Wrapper($mysqli);
  3. $result  = $wrapper->query('select...');
  4. echo $wrapper->field_count;//retorna el valor correspondiente
  5. echo $wrapper->affected_rows;//throws DomainException
  6. echo $wrapper->propiedad_que_no_existe;//throws RuntimeException

y sobre las restricciones de __get, pues si, esta en el manual(www.php.net/manual/en/language.oop5.overloading.php#object.get) y cito

Cita:
__get() is utilized for reading data from inaccessible properties.
Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #12 (permalink)  
Antiguo 02/02/2013, 07:05
Avatar de smcicoss  
Fecha de Ingreso: febrero-2013
Ubicación: Asturias
Mensajes: 5
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: function "magic" __get

Pues es cierto. Y pasé veinte veces pos ese párrafo. Aunque creo que debería de ser más explicito, como lo hacen en otras ocasiones, aclarando que SOLO para PROPIEDADES INACCESIBLES. En fin, tendré que poner más atención a la redacción en el manual.
Gracias por vuestra amabilidad.

Etiquetas: class, magic, php
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 12:33.