<?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->a = 1;
echo $obj->a . "\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";
?>
el resultado seria
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 quese llama 'hidden':
Las propiedades privadas pueden consultarse enla clase, por lo quenose usa __get()...
2
Las propiedades privadas no son visibles fuera dela clase, por lo quese usa __get()...
Consultando 'hidden'
Notice: Propiedad indefinida mediante __get(): hidden en <file> enlalínea 69 in <file>enlalínea 28
Entradas relacionadas
1
La Magia de los Métodos de PHP 😃💚
Los famosos métodos mágicos
Desde hace mucho tiempo escucho hablar sobre los famosos métodos de mágicos de PHP y la verdad sentía mucha curi
andreysabel
1
Poner foto de Gravatar en php
He creado una librería para traer la imagen de Gravatar a nuestra aplicación php en caso de que dicho usuario no tenga una foto en Gravatar
jruedaq
4
¡Apuntes del Curso de Introducción a PHP 2018!
Hola Gente! Aquí les dejo un link a Notion donde encontrarán mis notas del curso! Espero que les sirva!
https://www.notion.so/Curso-de-Intro
matiaswasiak
1
Descubre algunos de los Métodos Mágicos
Métodos Mágicos
Existen distintos tipos de métodos mágicos y todos tienen alguna característica que los diferencia, con el fin de optimizar
no se ve mi link, pero aqui lo dejo
https://youtu.be/x1bXHcbKtkw
<?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->a = 1; echo $obj->a . "\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"; ?>
el resultado seria
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 quese llama 'hidden': Las propiedades privadas pueden consultarse enla clase, por lo quenose usa __get()... 2 Las propiedades privadas no son visibles fuera dela clase, por lo quese usa __get()... Consultando 'hidden' Notice: Propiedad indefinida mediante __get(): hidden en <file> enlalínea 69 in <file>enlalínea 28