Menu
Coddy logo textTech

__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 - 42

O 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:

exists

Esses 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.

challenge icon

Desafio

Fácil

Vamos 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 classe Config que 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
    Adicione também um método 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 de Config e 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)

?>
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de PHP online