Foros del Web » Programando para Internet » PHP »

__get Y __set Necesito una pequeña guia

Estas en el tema de __get Y __set Necesito una pequeña guia en el foro de PHP en Foros del Web. Holas. Los asalto con una duda sobre un codigo que encontre por ahi. Código: <?php class Customer { public $name; private $data = array(); public ...

  #1 (permalink)  
Antiguo 08/02/2011, 13:40
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
__get Y __set Necesito una pequeña guia

Holas. Los asalto con una duda sobre un codigo que encontre por ahi.

Código:
<?php

class Customer
{
    public $name;
    private $data = array();
    
    public function __set($dt, $vl)
    {
        $this->data[$dt] = $vl;
    }
    
    public function __get($dt)
    {
        return $this->data[$dt];
    }
}

$c = new Customer;
$c->name = "Sunil"; //El nombre es seteado (set) porque es publico
$c->email = "[email protected]"; // Asignando [email protected] en $email

echo $c->email;
?>
Se entiende con esto que el asunto queda como $data[email]="[email protected]"

PERO lo que no entiendo es la ultima linea (echo $c->email;) ya que si borro las funciones "magicas" (__set y __get) me sigue funcionando y dando el mail. O sea, entiendo el porque pero con eso no le veo utilidad a __set y __get.

O tambien si hago publico data y pongo echo $c->data["email"] igual veo la variable y el get pierde sentido.

Alguien tiene un ejemplo sobre como usar bien __get y __set que sea entendible ? o este modificado para ver las propiedades de set y get.

Gracias
  #2 (permalink)  
Antiguo 08/02/2011, 13:49
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: __get Y __set Necesito una pequeña guia

hmm... creo que tienes serios problemas, deberías leer el manual oficial... no te parece?

se supone que un método mágico sirve para agregar cierto tipo de funcionalidad mas allá de lo que alcanzas a ver... y es bien claro, pero si definitivamente no le ves uso pues no lo uses!!

dichos métodos sirven para definir y obtener propiedades que no están claramente definidas en la clase, por eso se le conocen como métodos mágicos...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 08/02/2011, 13:53
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: __get Y __set Necesito una pequeña guia

Debes buscar información sobre como manejar clases en php, así verás por qué quitando las funciones el valor de $c->email continúa.
  #4 (permalink)  
Antiguo 08/02/2011, 19:39
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Yo pense que aca era diferente que en otros lados pero veo que la mala onda y los comentarios demas son cosa de todos los foros ...

Por favor. Lean la pregunta de nuevo entiendo para que sirven estos metodos magicos y entiendo porque $c -> email continua

Solo estoy preguntando por un ejemplo que se entienda y que no sea absurdo como este. Ya que independiente de get y set igual puedo manipular email. Entonces necesito si alguien me corrige el codigo o me guia con un metodo practico.

Para criticas y estupideces imagino que estan los foros de retardeo estilo 4chan. No les parece?

Gracias
  #5 (permalink)  
Antiguo 08/02/2011, 19:44
 
Fecha de Ingreso: diciembre-2010
Mensajes: 788
Antigüedad: 13 años, 4 meses
Puntos: 51
Respuesta: __get Y __set Necesito una pequeña guia

Cita:
Iniciado por GaDo Ver Mensaje
Yo pense que aca era diferente que en otros lados pero veo que la mala onda y los comentarios demas son cosa de todos los foros ...

Por favor. Lean la pregunta de nuevo entiendo para que sirven estos metodos magicos y entiendo porque $c -> email continua

Solo estoy preguntando por un ejemplo que se entienda y que no sea absurdo como este. Ya que independiente de get y set igual puedo manipular email. Entonces necesito si alguien me corrige el codigo o me guia con un metodo practico.

Para criticas y estupideces imagino que estan los foros de retardeo estilo 4chan. No les parece?

Gracias

Sin ofender, creo que el motivo del mal trato es por preguntar cosas que se encuentran facilmente googleando o buscando en el foro, además que son básicas y están en cualquier manual más o menos completo.
  #6 (permalink)  
Antiguo 08/02/2011, 20:30
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Cita:
Iniciado por walterdevel Ver Mensaje
Sin ofender, creo que el motivo del mal trato es por preguntar cosas que se encuentran facilmente googleando o buscando en el foro, además que son básicas y están en cualquier manual más o menos completo.
Pero si estoy preguntando es porque los ejemplos dados en esos manuales no me satisfacen del todo porque si le pongo comentarios al get y set puedo manipular las variables igual.

Solo pido un ejemplo practico. Es mucho pedir?

Ademas. Aunque la pregunta fuera de principiante sin saber absolutamente nada igual no justifica la falta de respeto y la nula tolerancia.

Saludos

P.D: Parece que no me entienden. Se para que se usan __get y __set. Solo pido un ejemplo practico de uso.
  #7 (permalink)  
Antiguo 08/02/2011, 21:26
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: __get Y __set Necesito una pequeña guia

Cita:
Iniciado por GaDo Ver Mensaje
P.D: Parece que no me entienden. Se para que se usan __get y __set. Solo pido un ejemplo practico de uso.
creo que aquí tu imaginación no da para mas... así que te pongo un ejemplo muy básico del uso de dichos métodos:

imaginemos que tienes una clase de configuración, en la cual no te gustaría definir ninguna opción dentro de la misma clase... osea, que te gustaría que su comportamiento fuera dinámico...

entonces, veamos esto:
Código PHP:
$config = new Config('my.ini');
echo 
$config->site_title;
$config->my_option 'my_value'
si tu clase no usa dichos métodos mágicos, ¿como saber que la propiedad site_title existe?

si imprimes una propiedad inexistente lo que obtienes es un error de propiedad no definida...

en dado caso, imaginemos que en el constructor de dicha clase cargamos la configuración a partir del archivo especificado: my.ini
Cita:
[config]
site_title=Hola mundo!
other_opt=false
y bueno, ya con el método __get (que como dicta el manual) podrías acceder a dicha configuración de una forma transparente, no tendiendo que definir propiedad por propiedad dentro de tu clase...

en resumen, el método __get se invoca cuando se trata de leer propiedades inexistentes de un objeto, y __set se invoca cuando se trata de asignar dichas propiedades!!

PDTA: que conste que todo esto viene escrito en el manual, si los arboles te impiden ver el bosque, deberías cambiar de profesión y/o hobbie...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 08/02/2011, 21:40
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Cita:
Iniciado por pateketrueke Ver Mensaje
creo que aquí tu imaginación no da para mas... así que te pongo un ejemplo muy básico del uso de dichos métodos:

imaginemos que tienes una clase de configuración, en la cual no te gustaría definir ninguna opción dentro de la misma clase... osea, que te gustaría que su comportamiento fuera dinámico...

entonces, veamos esto:
Código PHP:
$config = new Config('my.ini');
echo 
$config->site_title;
$config->my_option 'my_value'
si tu clase no usa dichos métodos mágicos, ¿como saber que la propiedad site_title existe?

si imprimes una propiedad inexistente lo que obtienes es un error de propiedad no definida...

en dado caso, imaginemos que en el constructor de dicha clase cargamos la configuración a partir del archivo especificado: my.ini


y bueno, ya con el método __get (que como dicta el manual) podrías acceder a dicha configuración de una forma transparente, no tendiendo que definir propiedad por propiedad dentro de tu clase...

en resumen, el método __get se invoca cuando se trata de leer propiedades inexistentes de un objeto, y __set se invoca cuando se trata de asignar dichas propiedades!!

PDTA: que conste que todo esto viene escrito en el manual, si los arboles te impiden ver el bosque, deberías cambiar de profesión y/o hobbie...
Me mandas a leer el manual e insinuas que no sirvo para esto. ¿Esta es la cordialidad del foro? Deberia de mandarte a hacer cursos de comprensión de lectura e ir a la escuela de nuevo si nos ponemos en ese tono tan burlesco ...

Voy a intentar explicarlo mas claro ..

Se como funcionan __get y __set. Se como se usa, se que las variables no declaradas dentro de la clase se colocan dentro de __get o sale error. Se todo lo que pones

Tanto cuesta entender lo que estoy preguntando ?. Solo estoy pidiendo un ejemplo practico. Mira

Código:
<?php

class Customer
{
    public $name;
    private $data = array();
    
    public function __set($dt, $vl)
    {
        $this->data[$dt] = $vl;
    }
    
    public function __get($dt)
    {
        return $this->data[$dt];
    }
}

$c = new Customer;
$c->name = "Sunil"; //El nombre es seteado (set) porque es publico
$c->email = "[email protected]"; // Asignando [email protected] en $email

echo $c->email;
?>
El codigo lo entiendo perfecto. Solo digo que me parece absurdo y con nula explicación. ¿Por que?

1. Porque si le pongo comentarios a los metodos de __set y __get ( /* */ ) igual me funciona el codigo. Ya que $c->email igual queda almacenado. Por ende el ejemplo es absurdo.

2. Entiendo perfectamente todo como explique mas arriba. __set lo que hace es crear data["Email"] = "[email protected]"

Lo unico que pido es un codigo con un uso practico de esto. Ya que, como dije anteriormente, si borro __set y __get el codigo me anda igual.

Espero que esta vez se haya entendido. Por favor cortenla con tratar de explicarme get y set porque lo entiendo. Espero no tener que repetirlo 10 veces.

Gracias

P.D: Y espero que me pidan disculpas por el pesimo trato ...

P.D2: Hay moderadores por aca imagino.

Anexo:

<?php

Código:
class Customer
{
    public $name;
    private $data = array();
}

$c = new Customer;
$c->name = "Sunil"; //El nombre es seteado (set) porque es publico
$c->email = "[email protected]"; // Asignando [email protected] en $email

echo $c->email;
?>
Removi get y set y el codigo funciona igual (era obvio sin siquiera removerlos). solo pido un ejemplo practico para poderlo ver mas claro ¿Tan dificil es entenderlo?
  #9 (permalink)  
Antiguo 08/02/2011, 22:23
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: __get Y __set Necesito una pequeña guia



disculpa, debí advertir que tampoco leíste mi firma...

Cita:
Iniciado por pateketrueke Ver Mensaje
se supone que un método mágico sirve para agregar cierto tipo de funcionalidad mas allá de lo que alcanzas a ver... y es bien claro, pero si definitivamente no le ves uso pues no lo uses!!
la importancia de un método mágico no la vas a poder contemplar con ejemplos simples como el que tu mismo calificas de absurdo, y en realidad lo es, no lo dudo!!

de verdad, te lo dejo a tu imaginación, pues como ya te he sugerido... si no te es de utilidad dicho patrón no lo uses ahora, no hay necesidad ni obligación de nada, pero si no olvides que la reflexión juega una labor importante en el desarrollo de algoritmos...

y aquí un poco del manual, con bastantes ejemplos mas amplios claro...
http://www.php.net/manual/es/languag...verloading.php


Anexo:

PDTA: si, que alguien haga algo por favor... off-topic, RTFM please!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 09/02/2011, 02:36
 
Fecha de Ingreso: octubre-2009
Mensajes: 245
Antigüedad: 14 años, 6 meses
Puntos: 17
Respuesta: __get Y __set Necesito una pequeña guia

Cita:
Removi get y set y el codigo funciona igual (era obvio sin siquiera removerlos). solo pido un ejemplo practico para poderlo ver mas claro ¿Tan dificil es entenderlo?
Mira la utilidad de usar __get y __set es de crear objetos mas dinámicos respetando la encapsulacion te dejo un ejemplo practico de su uso.
Código PHP:
Ver original
  1. class User{
  2.  
  3.     private $data = array();
  4.     private $dbh;
  5.  
  6.     public function  __construct($user) {
  7.         $this->dbh = new PDO('mysql:host=localhost;dbname=dbtest', '','');
  8.         $query = "SELECT * FROM users WHERE username = ?";
  9.         $stm = $this->dbh->prepare($query);
  10.         $stm->execute(array($user));
  11.         $this->data  = $stm->fetch(PDO::FETCH_ASSOC);
  12.     }
  13.  
  14.     public function  __set($name, $value) {
  15.         if(isset($this->data[$name])){
  16.             $this->data[$name] = $value;
  17.         }
  18.     }
  19.  
  20.     public function  __get($name) {
  21.         if(isset($this->data[$name])){
  22.             return $this->data[$name];
  23.         }
  24.     }
  25.  
  26.     public function save() {
  27.         $sql = "UPDATE users SET name = ?, lastname = ?, username = ?, password = ? WHERE id_user = ?";
  28.         $stm = $this->dbh->prepare($sql);
  29.         $stm->execute(array($this->name,$this->lastname,$this->username,$this->password,$this->id_user));
  30.     }
  31.  
  32. }
  33.  
  34. $user = new User('jjsavines');
  35. echo $user->name .'<br />';
  36. echo $user->password .'<br />';
  37. echo $user->username .'<br />';
  38. $user->password = 'superv'; // change user password
  39. $user->save();
  40. echo $user->password .'<br />';

En este ejemplo me hice una mini implementación de un ActiveRecord, la ventaja en usar los métodos mágicos es que si mas adelante altero la estructura de la tabla users mi clase queda sin cambios, bueno con excepción del método save pero puede modificarse para que pase los elementos que debe y de esa forma no depender de los cambios en la tabla.
Este ejemplo es sencillo se puede hacer cosas mas complejas aprovechando los métodos, Pero como todo hay un punto flaco y es que es un problema para documentarlos con herramientas como phpDocumentor, pueden ser confusos y ademas siempre esta la opción de agregar un set o get manualmente.
Prueba el ejemplo por que lo estoy haciendo a la carrera y hay varias cosas que pase por alto como lo del save.
__________________
Saludos.
  #11 (permalink)  
Antiguo 09/02/2011, 09:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: __get Y __set Necesito una pequeña guia

También sería bueno que activaras en tu error_reporting E_STRICT, así puedes ver que si seteas una variable que no existe (como $c->email) veras que te genera un NOTICE ya que no es lo correcto y lo correcto es que tu como programador crees esas variables o uses métodos magicos para simular el valor.
  #12 (permalink)  
Antiguo 09/02/2011, 11:47
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

En el manual no voy ni en base de datos ni en el asunto de los errores.

Gracias por sus aportes y su amabilidad

He buscado varios codigos y todos funcionan bien si elimino __get y __set. Aun no pillo un ejemplo practico sobre el uso de estos dos metodos magicos que me diga "oh!. Puedo aprovecharlos para esto".

Me adelantare para ver bien el codigo de Jaime y captarlo al 100%

Gracias de nuevo
  #13 (permalink)  
Antiguo 09/02/2011, 12:16
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Perdon si doble edito.

Otro codigo:

Código:
class User
{
    // constructor (not implemented)
    public function _construct()
    {
    }

/*    // set undeclared property
    function __set($property, $value)
    {
        $this->$property = $value;
    }

// get defined property
    function __get($property)
    {
        if (isset($this->$property)) {
            return $this->$property;
        }

    }
*/
}

// example of usage of 'User' class with property overloading
$user = new User();
$user->fname = 'Alejandro';
$user->lname = 'Gervasio';
$user->email = '[email protected]';
$user->address = 'My address 1234';

// display user data
echo 'First Name: ' . $user->fname . ' Last Name: ' . $user->lname . ' Email: ' . $user->email . ' Address: ' . $user->address;
Como pueden ver. Comente __get y __set y el codigo igualmente funciona...

Si borro el contenido de Set las variables quedan en blanco (al fin algo de logica) pero si borro el contenido de Get el script funciona igual.

Ahora entienden (al fin) lo que intento preguntar?
  #14 (permalink)  
Antiguo 09/02/2011, 12:35
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: __get Y __set Necesito una pequeña guia

Cita:
Iniciado por GaDo Ver Mensaje
Ahora entienden (al fin) lo que intento preguntar?
otra ves la burra al trigo?

entiende que entendemos perfectamente tu dilema, y aquí el problema es que tu no alcanzas a ver nada de lo que se te indica... osea, creo que realmente deberías darte un tiempo en reflexionar la utilidad de dichos métodos mágicos!!

por mucho código que te mostremos (por cierto, ¿si revisaste los ejemplos del manual?), por mucha explicación que demos, si tu no consigues ver su utilidad vuelvo a lo mismo: no los uses...

en si tu problema es meramente conceptual, y definitivamente no hay necesidad de seguir alimentando tu ignorancia, solo la experiencia te demostrará la utilidad de dichos conceptos...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #15 (permalink)  
Antiguo 09/02/2011, 12:53
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Lamentablemente no existe un boton ignorar mensajes ...

Alguien que no sea pateketrueke tendría la voluntad de ayudarme con un codigo que se aprecie el uso de __get ?? Alguien que entienda lo que busco

Te agradeceria pateketrueke no contestar mas en este topic. Me molesta tu presencia. Se que eres colaborador pero respeta mi petición por favor. Ya cumplí con reportar.

Gracias

P.D: Ya entendi mas o menos __set. Solo me falta __get ya que por mas que modifico esta función igual me sigue devolviendo los mismos valores

Última edición por GaDo; 09/02/2011 a las 13:02
  #16 (permalink)  
Antiguo 09/02/2011, 13:07
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: __get Y __set Necesito una pequeña guia

GaDo, lamentablemente no existe todo eso que dices... de hecho, de ser posible ya hubiera cerrado tu tema y te hubiera enviado a leer el manual...

¿porque?

no entiendo porque eres tan necio, si hay ejemplos bastante claros en el manual...

http://www.php.net/manual/es/languag...ding.php#97572
Cita:
He escrito una función breve, genérico para __get () y __set () que funciona de acceso, de ejecución y funciones de mutación.

Esto permite al programador utilizar de acceso implícito y métodos mutadores cuando se trabaja con datos de atributos.
Código php:
Ver original
  1. class MyClass
  2. {
  3.     private $degrees
  4.  
  5.     public function __get($name)
  6.     {
  7.         $fn_name = 'get_' . $name;
  8.         if (method_exists($this, $fn_name))
  9.         {
  10.             return $this->$fn_name();
  11.         }
  12.         else
  13.         {
  14.             return null;
  15.         }
  16.     }
  17.  
  18.     public function __set($name, $value)
  19.     {
  20.         $fn_name = 'set_' . $name;
  21.         if (method_exists($this, $fn_name))
  22.         {
  23.             $this->$fn_name($value);
  24.         }
  25.     }
  26.  
  27.     private function get_degrees()
  28.     {
  29.         return $this->degrees;
  30.     }
  31.    
  32.     private function set_degrees($value)
  33.     {
  34.         $this->degrees = $value &#37; 360;
  35.        if ($degrees < 0) $this->degrees += 360;
  36.     }
  37. }
(el código tiene un error, debería ser % y no &#37;)

que conste que todo esto no lo hago por ti, sino porque alguien en un futuro segura leerá este tema y dirá: vaya, tan claro que es... y de seguro recibirás algún comentario honesto, o descalificador según tu enfoque...

PDTA: ojo, el que se enoja pierde...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #17 (permalink)  
Antiguo 09/02/2011, 14:35
 
Fecha de Ingreso: diciembre-2010
Mensajes: 788
Antigüedad: 13 años, 4 meses
Puntos: 51
Respuesta: __get Y __set Necesito una pequeña guia

Y entonces para que sirven???? broma XD
  #18 (permalink)  
Antiguo 09/02/2011, 17:24
Avatar de trollosaurio  
Fecha de Ingreso: febrero-2011
Mensajes: 2
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Si la magia de PHP es demasiada, un simple goto mejorará el flujo de tu programa.
  #19 (permalink)  
Antiguo 09/02/2011, 19:20
Avatar de dual3nigma
Colaborador
 
Fecha de Ingreso: febrero-2010
Ubicación: Ciudad de México
Mensajes: 295
Antigüedad: 14 años, 1 mes
Puntos: 122
Respuesta: __get Y __set Necesito una pequeña guia

Hola GaDo! desde mi punto de vista, una de las ventajas de utilizar los métodos mágicos es que te da "extensibilidad" por ejemplo podrias tener algo asi:
Código PHP:
Ver original
  1. public function __set($nombre, $valor)
  2.     {
  3.         $func = "filtros_{$nombre}";
  4.         $this->_data[$nombre] = function_exists($func) ? $func($valor) : $valor;
  5. }
te fijas? cada vez que pongo una variable me fijo si existe una funcion por ejemplo filtro_website(), asi puedo tener un archivo separado (filtros.php por ejemplo) con todo el "post proccessing" y puedo ir agregando funciones conforme necesite sin necesidad de meterme mas con mi clase, el uso sería por ejemplo:

Código PHP:
Ver original
  1. $usuario->website = 'website.com';

y en mi function filtros_website() lo convertiria quizas a '<a href="http://website.com"'>website.com</a>

Que te parece? espero que te sirva de algo y gustas un ejemplo mas en forma te lo mando!
Saludos!
  #20 (permalink)  
Antiguo 09/02/2011, 19:31
Avatar de dual3nigma
Colaborador
 
Fecha de Ingreso: febrero-2010
Ubicación: Ciudad de México
Mensajes: 295
Antigüedad: 14 años, 1 mes
Puntos: 122
Respuesta: __get Y __set Necesito una pequeña guia

Mira te posteo de una vez un ejemplo basiquisimo:
Código PHP:
Ver original
  1. function filtro_website($param)
  2. {
  3.     return sprintf('<a href="http://%1$s" target="_blank">%1$s</a>', $param);
  4. }
  5.  
  6. class Usuario
  7. {
  8.     private $_data = array();
  9.    
  10.     public function __get($nombre)
  11.     {
  12.         if(isset($this->_data[$nombre]))
  13.             return $this->_data[$nombre];
  14.        
  15.         return false;
  16.     }
  17.    
  18.     public function __set($nombre, $valor)
  19.     {
  20.         $func = "filtro_{$nombre}";
  21.        
  22.         $this->_data[$nombre] = function_exists($func) ? $func($valor) : $valor;
  23.     }
  24. };
  25.  
  26.  
  27. $dual3nigma = new Usuario();
  28.  
  29. $dual3nigma->nombre = "Adán";
  30. $dual3nigma->website = "dual.3nigma.com";
  31.  
  32.  
  33. echo $dual3nigma->website; // <a href="http://dual.3nigma.com">dual.3nigma.com</a>
  #21 (permalink)  
Antiguo 09/02/2011, 19:42
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Cita:
Iniciado por dual3nigma Ver Mensaje
Hola GaDo! desde mi punto de vista, una de las ventajas de utilizar los métodos mágicos es que te da "extensibilidad" por ejemplo podrias tener algo asi:
Código PHP:
Ver original
  1. public function __set($nombre, $valor)
  2.     {
  3.         $func = "filtros_{$nombre}";
  4.         $this->_data[$nombre] = function_exists($func) ? $func($valor) : $valor;
  5. }
te fijas? cada vez que pongo una variable me fijo si existe una funcion por ejemplo filtro_website(), asi puedo tener un archivo separado (filtros.php por ejemplo) con todo el "post proccessing" y puedo ir agregando funciones conforme necesite sin necesidad de meterme mas con mi clase, el uso sería por ejemplo:

Código PHP:
Ver original
  1. $usuario->website = 'website.com';

y en mi function filtros_website() lo convertiria quizas a '<a href="http://website.com"'>website.com</a>

Que te parece? espero que te sirva de algo y gustas un ejemplo mas en forma te lo mando!
Saludos!
estimado.

Modifique un poco tu codigo para mostrarte como entendi __set.

Código:
class MiClase
{
    public function __set($nombre, $valor)
        {
        $this -> $nombre = "visita $valor";
        }
}

$usuario = new MiClase;

$usuario->website = 'website.com';

echo $usuario -> website;
Ya que se almacena en $usuario -> $nombre = "visita website.com" y al fin se ve una diferencia con todos los codigos anteriores. Ya que ellos, si les borro el __set, igual se ve la variable dada ("en este caso: website.com"). al fin veo un uso razonable para __set

Tienes un ejemplo parecido para poder ver bien el funcionamiento de get ?

Me agarre de tu ejemplo para clarificar tu pregunta.. Muchas gracias

--------------------------------------------

Y una reflexión. Si entra aca un usuario noob que ni siquiera sabe sumar variables deberian de ayudarlo con amabilidad. nada justifica el mal trato al que no sabe. Sino que hay que incentivarlo. Sobretodo con ese afan vengativo de decir "Lo dejo aca para que se rian de lo tonto que fuiste". Si pasa un año y alguien ve ese post ... o si yo lo veo quizas diga . "chuta que estaba perdido" porque no naci sabiendo PHP. Creo que deberian de entenderlo y no creerse seres superiores ni votar las frustraciones de la vida real con alguien que recien esta empezando.

Saludos


[code]
  #22 (permalink)  
Antiguo 09/02/2011, 20:45
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Código:
class MiClase
{
    private $ejemplo;
    public function __set($nombre, $valor)
        {
        
        $this -> $nombre = $valor;
        }

    public function __get($nombre)
    { 
        return "Ingresa a $this->nombre ";
    }
}
$usuario = new MiClase;

$usuario->website = 'website.com';

echo $usuario -> website;
¿Porque no me funciona este__get?

Si lo hago de set funciona pero cambio el contenido de la variable. Yo solo quiero que bote otra cosa. (en el fondo entender con un ejemplo practico el ejemplo de __get)

Con arrays como lo plantea dual3nigma me funciona perfecto. Muchas gracias por tu ejemplo :)
  #23 (permalink)  
Antiguo 09/02/2011, 20:50
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: __get Y __set Necesito una pequeña guia

No te funciona porque tienes error de sintaxis.
Código PHP:
Ver original
  1. public function __get($nombre)
  2.     {
  3.         return $this->$nombre;
  4.        //alternativa:
  5.       //return "Ingresa {$this->$nombre}";
  6.  
  7.     }
__________________
I see dead pixels
  #24 (permalink)  
Antiguo 09/02/2011, 20:52
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: __get Y __set Necesito una pequeña guia

Ejemplo del manual de Zend Framework y que aun utilizo en mis aplicaciones:
Código PHP:
Ver original
  1. /**
  2.      *
  3.      * @param string $name
  4.      * @param mixed $value
  5.      */
  6.     public function __set($name,$value)
  7.     {
  8.         $method = 'set' . $name;
  9.         if(strripos('mapper', $name) !== false || !method_exists($this, $method)){
  10.             throw new Exception('Invalid property');
  11.         }
  12.         $this->$method($value);
  13.     }
  14.  
  15.     /**
  16.      *
  17.      * @param string $name
  18.      * @return mixed
  19.      */
  20.     public function __get($name)
  21.     {
  22.         $method = 'get' . $name;
  23.         if(strripos('mapper', $name) !== false || !method_exists($this, $method)){
  24.             throw new Exception('Invalid property');
  25.         }
  26.         return $this->$method();
  27.     }
__________________
I see dead pixels
  #25 (permalink)  
Antiguo 09/02/2011, 20:54
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Cita:
Iniciado por SergeMedina Ver Mensaje
No te funciona porque tienes error de sintaxis.
Código PHP:
Ver original
  1. public function __get($nombre)
  2.     {
  3.         return $this->$nombre;
  4.        //alternativa:
  5.       //return "Ingresa {$this->$nombre}";
  6.  
  7.     }
Si me corre. Pero quiero que me devuelva "ingresa a website.com" y no me funciona tu solución.

La unica manera con la que funciona es con:

Código:
class MiClase
{
    private $ejemplo;
    public function __set($nombre, $valor)
        {
        
        $this -> $nombre = "Ingresa a $valor";
        }

    public function __get($nombre)
    { 
        return $this->nombre;
    }
}
$usuario = new MiClase;

$usuario->website = 'website.com';

echo $usuario -> website;
Pero cambio el valor de la variable $usuario -> website y no quiero eso. Quiero que me devuelva "Ingresa a website.com" sin cambiarme el valor. Para eso me imagino que esta la función get. no ?

Lo otro es que el __get funciona siempre y cuando __set se asigne con un valor distinto puesto en $nombre como en el ejemplo original del website ...

Última edición por GaDo; 09/02/2011 a las 21:08
  #26 (permalink)  
Antiguo 09/02/2011, 21:17
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

La unica forma con la que lo pude hacer fue asi:

Código:
class MiClase
{
    private $ejemplo= array();
    public function __set($nombre, $valor)
        {
        
        $this -> ejemplo[$nombre] = $valor;
        }

    public function __get($nombre)
    { 
        return "Ingresa a {$this->ejemplo[$nombre]}";
    }
}
$usuario = new MiClase;

$usuario->website = 'website.com';

echo $usuario -> website;
Como conclusión.

1.- Con Set puedes manipular el valor
2.- Get funciona siempre y cuando se cambie la variable de entrada usada en __set como en este ejemplo.

Pero. ¿Es necesario usar un array (y por ende gastar memoria en una nueva variable) para poder controlar el __get ??. Porque con un return "Ingresa a {$this->nombre}" se supone que deberia funcionar pero por un extraño motivo no lo hace.

Conviene usar estas funciones magicas o conviene crear dos variables publicas (get_esto y set_esto por ejemplo) para hacer estas operaciones?
  #27 (permalink)  
Antiguo 09/02/2011, 21:20
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: __get Y __set Necesito una pequeña guia

Analiza la respuesta que te di anteriormente.

Lo mejor que puedes hacer es distraerte en otra cosa y despues continuar viendo este tema.

Saludos.
__________________
I see dead pixels
  #28 (permalink)  
Antiguo 10/02/2011, 00:00
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: __get Y __set Necesito una pequeña guia

GaDo, al final solo has demostrado un dicho bien dicho... que antes de comenzar a correr, primero deberías saber caminar, y mucho antes gatear!!

quieres absorber un conocimiento que la verdad se te escapa de tus manos, si de verdad te consideras novato actúa como tal... no intentes masticar conceptos de OO que están fuera de tu entendimiento actual...

y si, releyendo todo lo que dices... justificas por nada tu falta de experiencia, así que lo mejor que puedes hacer es lo último que te han dicho: debes relajarte, volver a lo básico y cuando ya entiendas mas del lenguaje relee lo que decías, y verás a lo que nos referíamos...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #29 (permalink)  
Antiguo 10/02/2011, 04:45
 
Fecha de Ingreso: agosto-2010
Ubicación: Oakland california
Mensajes: 393
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: __get Y __set Necesito una pequeña guia

Creo que las mentes de nosotros los seres humanos no funcionan igual, y por consecuencia algunos se nos facilitan o dificultan hacer o entender ciertas cosas, claro que la pereza es otra tema, algunas personas no pueden ponerse en el lugar del otro emocionalmente, son incapaces de sentir empatía, a esas personas se les suele llamar sicópatas, claro el que se enoja pierde pero que ganamos con insultar de alguna manera la inteligencia del otro?

Permita que la otra persona salve su propio prestigio.

Sin pensar jamás que herimos el orgullo del prójimo. Aun cuando tengamos razón y la otra persona esté claramente equivocada, sólo haremos daño si le hacemos perder prestigio. “No tengo derecho a decir o hacer nada -escribió A. De Saint Exupéry- que disminuya a un hombre ante sí mismo. Lo que importa no es lo que yo pienso de él, sino lo que él piensa de si mismo. Herir a un hombre en su dignidad es un crimen. -- Dale Carnegie
  #30 (permalink)  
Antiguo 10/02/2011, 06:32
 
Fecha de Ingreso: enero-2007
Mensajes: 16
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: __get Y __set Necesito una pequeña guia

Okey. Segui el consejo de SergeMedina. Dormi y hoy dia veo los codigos y se plantea como lo digo (o bien parecido)

Todo lo que pedia era un ejemplo practico porque en la mayoria de los que dieron uno eliminaba el set o el get y quedaba igual. Pero los de Serge me sirvieron (y el de dual3digma) y ya le vi el uso y experimente con set y get.

Solo me queda por preguntar. Como experiencia personal. Prefieren crear sus propias funciones get y set o prefieren usar las funciones magicas ? Ambas formas me parecen bien pero con las funciones magicas creo que se puede lograr facilidad si se estudia bien. Queda la pregunta abierta.

Muchas gracias. Me quedo bastante claro el uso y pateketrueke. JAMAS entendiste lo que pregunte y se nota hasta en tu ultimo post. Solo espero por el bien de este foro que el resto de colaboradores no sea tan miserable de alma como tu. Ni siquiera tienes la autocritica de decir un "lo siento. me excedi".

Muchos saludos y gracias nuevamente a las personas que intentaron ayudar de alguna forma.

Última edición por GaDo; 10/02/2011 a las 06:39

Etiquetas: guia, pequeña, set
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 07:11.