PHP 5. Función __get
4 seguidores
¿Que hace exactamente la función __get?
<code> // Método de acceso al valor del contador
function __get($propiedad)
{
echo '<br>$propiedad(contador)= ' .$propiedad .'<br>';
if($propiedad == 'Valor')
return $this->nVisitas;
else
return null;
}
}</code>
Derus
Si gracias, me ha costado pero ya lo entiendo. Tendre que usar el metodo _set para lo que yo pretendo.
Kr0n
__get sólo se llama cuando el atributo no se encuentra definido "realmente".
Si tú estás haciendo previamente un
<code>$objeto->prueba = 'valor';</code>
ya estás definiendo ese atributo en el ámbito de la clase, con lo que cuando hagas
<code>echo $objeto->prueba;</code>
no se llamará a __get, sino que directamente se mostrará el valor de la variable que acabas de definir.
Otra cosa es que redefinas igualmente el método __set, que por ejemplo defina las variables en un array interno de la clase o similar.
No se si con esto te queda más claro.
Derus
Ok pero al hacer la primera llamada a __GET la de
$objeto->prueba= "Valor"; y quitando la otra.
Ya le deberia llegar a GET la variable $objeto->prueba con el valor interno
de "valor" y sin embargo no se muestra la cadena de texto correspondiente
happywebcoder
<fieldset>pero mira este ejemplo si se llama a una propiedad que no existe, se activara esta funcion __get. </fieldset>
De hecho estás llamando dos veces a esa propiedad: una provoca una llamada a __set:
<code>$objeto->prueba= "Valor";
</code>
...y otra a __get:
<code>$objeto->prueba;</code>
Siguiendo vuestro ejemplo:
<code>
class Foo [
public $foo = "foo";
public function __get($var) [
echo "accediendo a la propiedad no definida '$var'";
]
public function __set($var, $val)[
echo "intentando asignar el valor '$val' a la propiedad no definida '$var'";
]
]
$foo = new Foo();
$foo->foo;
$foo->bar; // leer la prop. que no existe: llamada a __get
$foo->bar = 'valor'; // escribir prop. que no existe: llamada a __set
</code>
Derus
Muchas gracias por contestar tan rapido tio. ya lo entiendo.
pero mira este ejemplo si se llama a una propiedad que no existe, se activara esta funcion __get.
Se mostrara el texto "Activando función Get" pero la comparación que hace despues... If ($propiedad =='valor') todo el rato me devuelve null. Aunque cree una variable con el contenido 'Valor'.
¿como se puede hacer que le llegue una variable que no este vacia a la función __Get?
[?php
class Clase [
public $a;
function __get($propiedad)
[
echo '<br>Activando función Get<br>';
if($propiedad == 'Valor')
echo "El contenido de $propiedad es igual a 'Valor'";
else
return null;
]
]
$objeto= new Clase();
$objeto->prueba= "Valor";
echo $objeto->prueba;
dagi3d
<code>
[?php
class Foo {
public $foo = "foo";
public function __get($var) {
echo "accediendo a la propiedad no definida '$var'";
}
}
$foo = new Foo();
$foo->foo; // foo
$foo->bar; // "accediendo a la propiedad no definida 'bar'"
?]
</code>
como puedas ver, el atributo 'foo' sí está definido y por eso nos devolverá el valor que tenga asignado. en cambio, al tratar de acceder a 'bar', como no existe, pues se llama al método __get (en caso de que $bar estuviese definida dentro de clase Foo pero con el ámbito 'private' o 'protected' también se llamaría a __get()
Derus
Si eso es mas o menos lo que pone en el manual. Pero no entiendo a que se refiere.
Me podrias hacer un ejemplo suave de como se hace una llamada a una propiedad no definida.
Gracias
dagi3d
el método __get es llamado cuando estás tratando de acceder a una propiedad no definida del objeto (y el __set igual, pero cuando estás asignando un valor)