__get, __set, __isset, __unset
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 46 de 91.
PHP proporciona cuatro métodos mágicos que interceptan el acceso a propiedades: __get(), __set(), __isset() y __unset(). Estos se activan cuando intentas acceder a propiedades que no existen o no son accesibles.
El método __get() se llama al leer una propiedad inaccesible, mientras que __set() se encarga de escribir en ella. Esto te permite crear propiedades dinámicas o añadir lógica cuando se accede a las propiedades:
<?php
class DynamicObject {
private array $data = [];
public function __get(string $name): mixed {
return $this->data[$name] ?? null;
}
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
}
$obj = new DynamicObject();
$obj->title = "Hello";
$obj->count = 42;
echo $obj->title . " - " . $obj->count;
Salida:
Hello - 42El método __isset() se activa mediante isset() o empty(), y __unset() responde a la función unset():
<?php
class DynamicObject {
private array $data = [];
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
public function __isset(string $name): bool {
return isset($this->data[$name]);
}
public function __unset(string $name): void {
unset($this->data[$name]);
}
}
$obj = new DynamicObject();
$obj->name = "Test";
echo isset($obj->name) ? "exists" : "missing";
Salida:
REQUIRED OUTPUT FORMAT:existsEstos métodos se utilizan habitualmente para crear contenedores de datos flexibles, implementar la carga diferida o construir objetos que se comportan como arrays mientras mantienen una estructura orientada a objetos.
Desafío
FácilConstruyamos un administrador de configuración flexible que almacene la configuración dinámicamente mediante métodos mágicos. Tu clase interceptará el acceso a las propiedades para gestionar los valores de configuración, comprobar si existen configuraciones y eliminarlas cuando sea necesario, todo ello sin definir explícitamente cada propiedad.
Organizarás tu código en dos archivos:
Config.php: Crea una claseConfigque utilice un array privado para almacenar internamente los valores de configuración. Implementa los cuatro métodos mágicos de propiedades:__get($name): Devuelve el valor de la clave indicada o"undefined"si la clave no existe__set($name, $value): Almacena el valor bajo la clave indicada__isset($name): Devuelve si la clave existe en la configuración__unset($name): Elimina la clave de la configuración
count()que devuelva el número de configuraciones almacenadas.main.php: Incluye el archivo Config. Recibirás tres entradas: un nombre de configuración, un valor de configuración y un segundo nombre de configuración. Crea una instancia deConfigy realiza estas operaciones:- Establece la primera configuración con el valor indicado
- Imprime si la primera configuración existe usando
isset(): muestra"exists"o"missing" - Imprime el valor de la primera configuración
- Imprime el número actual de configuraciones
- Usa
unset()para eliminar la primera configuración - Imprime si la primera configuración existe ahora: muestra
"exists"o"missing" - Imprime el valor de la segunda configuración (que nunca se estableció)
Cada salida debe aparecer en su propia línea. Los métodos mágicos te permiten interactuar con tu objeto Config usando una sintaxis natural de propiedades, como $config->theme = "dark" y isset($config->theme), aunque no haya propiedades reales definidas.
Pruébalo tú mismo
<?php
require_once 'Config.php';
// Leer entradas
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));
// TODO: Crea una instancia de Config
// TODO: Establece el primer setting al valor dado
// TODO: Imprime si el primer setting existe ("exists" o "missing")
// TODO: Imprime el valor del primer setting
// TODO: Imprime el recuento actual de settings
// TODO: Usa unset() para eliminar el primer setting
// TODO: Imprime si el primer setting existe ahora ("exists" o "missing")
// TODO: Imprime el valor del segundo setting (que nunca fue establecido)
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online