__get, __set, __isset, __unset
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 46 de 91.
O PHP fornece quatro métodos mágicos que interceptam o acesso a propriedades: __get(), __set(), __isset() e __unset(). Eles são acionados quando você tenta acessar propriedades que não existem ou estão inacessíveis.
O método __get() é chamado ao ler uma propriedade inacessível, enquanto __set() trata da escrita em uma. Isso permite criar propriedades dinâmicas ou adicionar lógica quando as propriedades são acessadas:
<?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;
Saída:
Hello - 42O método __isset() é acionado por isset() ou empty(), e __unset() responde à função 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";
Saída:
existsEsses métodos são comumente usados para criar contêineres de dados flexíveis, implementar carregamento lento ou criar objetos que se comportam como arrays, mantendo a estrutura orientada a objetos.
Desafio
FácilVamos criar um gerenciador de configurações flexível que armazena configurações dinamicamente usando métodos mágicos. Sua classe interceptará o acesso às propriedades para gerenciar os valores de configuração, verificar se as configurações existem e removê-las quando necessário — tudo isso sem definir explicitamente cada propriedade.
Você organizará seu código em dois arquivos:
Config.php: crie uma classeConfigque use um array privado para armazenar internamente os valores de configuração. Implemente todos os quatro métodos mágicos de propriedade:__get($name): retorna o valor da chave fornecida ou"undefined"se a chave não existir__set($name, $value): armazena o valor na chave fornecida__isset($name): retorna se a chave existe na configuração__unset($name): remove a chave da configuração
count()que retorne o número de configurações armazenadas.main.php: inclua o arquivo Config. Você receberá três entradas: um nome de configuração, um valor de configuração e um segundo nome de configuração. Crie uma instância deConfige realize estas operações:- Defina a primeira configuração com o valor fornecido
- Imprima se a primeira configuração existe usando
isset(): exiba"exists"ou"missing" - Imprima o valor da primeira configuração
- Imprima a quantidade atual de configurações
- Use
unset()para remover a primeira configuração - Imprima se a primeira configuração existe agora: exiba
"exists"ou"missing" - Imprima o valor da segunda configuração (que nunca foi definida)
Cada saída deve estar em sua própria linha. Os métodos mágicos permitem interagir com seu objeto Config usando uma sintaxe natural de propriedade, como $config->theme = "dark" e isset($config->theme), mesmo que nenhuma propriedade real esteja definida.
Experimente você mesmo
<?php
require_once 'Config.php';
// Ler entradas
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));
// TODO: Crie uma instância de Config
// TODO: Defina a primeira configuração para o valor fornecido
// TODO: Imprima se a primeira configuração existe ("exists" ou "missing")
// TODO: Imprima o valor da primeira configuração
// TODO: Imprima a contagem atual de configurações
// TODO: Use unset() para remover a primeira configuração
// TODO: Imprima se a primeira configuração existe agora ("exists" ou "missing")
// TODO: Imprima o valor da segunda configuração (que nunca foi definida)
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto organizado5Interfaces e Contratos
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre TraitsMétodos Abstratos em TraitsTraits vs. Herança12Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de PHP online