Cuando estamos programando con clases en PHP, a veces tenemos la necesidad de acceder a atributos privados de una clase desde fuera, tal vez para sólo lectura, sólo escritura, o porque estos no pueden tener cualquier valor.
Pero claro, son atributos privados, no podemos hacer esto tal alegremente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php class test { private $privado; function test() { $privado="Variable privada"; } } $t=new test; echo $t->privado; ?> |
En C++, por ejemplo, definimos getters/setters para todos los atributos qud podamos «tocar» desde fuera, aunque, es escribir demasiado (tratamos cada atributo por separado, y está bien). Por otra parte, en PHP tenemos los métodos mágicos, y entre ellos encontramos __get() y __set() y haciendo caso al ejemplo anterior podemos hacer lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php class test { private $privado; function test() { $this->privado="Variable privada"; } function __get($atrib) { return $this->$atrib; } } $t=new test; echo $t->privado; ?> |
Aunque de esta forma, para qué queremos atributos privados ? Si bueno, podríamos leerlos todos, escribirlos no, aunque podemos hacer una pequeña implementación para tener un cierto control sobre qué atributos privados son visibles desde fuera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php class test { private $privado; private $visible; private $oculto; private $atributos_visibles=array("privado", "visible"); function test() { $this->privado="Variable privada"; $this->visible="Atributo privado visible"; $this->oculto="Atributo privado oculto"; } function __get($atrib) { if (in_array($atrib, $this->atributos_visibles)) return $this->$atrib; else return false; } } $t=new test; echo $t->privado."\n"; echo $t->visible."\n"; echo $t->oculto."\n"; ?> |
Obtendremos:
$ php getset.php
Variable privadaAtributo privado visible[gaspy@lytio blog]$ php getset.php
Variable privada
Atributo privado visible
De esta forma, podemos evitar errores en caso de atributos inexistentes, y evitar que los que no queremos no se puedan leer. Lo mismo podemos hacer con los setters:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php class test { private $privado; private $visible; private $oculto; private $atributos_visibles=array("privado", "visible"); private $atributos_tocables=array("privado"); function test() { $this->privado="Variable privada"; $this->visible="Atributo privado visible"; $this->oculto="Atributo privado oculto"; } function __get($atrib) { if (in_array($atrib, $this->atributos_visibles)) return $this->$atrib; else return false; } function __set($atrib, $valor) { if (in_array($atrib, $this->atributos_tocables)) $this->$atrib=$valor; } } $t=new test; $t->privado="VALOR NUEVO DE PRIVADO"; $t->visible="VALOR NUEVO DE VISIBLE"; echo $t->privado."\n"; echo $t->visible."\n"; echo $t->oculto."\n"; ?> |
Por otra parte, si deseamos filtrar la entrada de esos atributos, es decir, que por ejemplo, privado deba ser un número entre 0 y 10, debemos implementarlo dentro de __set (con un switch por ejemplo, o comprobar si es un valor que debemos filtrar, entonces llamamos a una función que verifique su valor).
Pingback: Bitacoras.com /