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(). Estes 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 o __set() lida com a escrita em uma. Isso permite que você crie propriedades dinâmicas ou adicione 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 o __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

Estes métodos são comumente usados para criar contêineres de dados flexíveis, implementar lazy loading ou construir objetos que se comportam como arrays, mantendo uma estrutura orientada a objetos.

challenge icon

Desafio

Fácil

Vamos construir um gerenciador de configuração flexível que armazena configurações dinamicamente usando métodos mágicos. Sua classe interceptará o acesso a propriedades para gerenciar valores de configuração, verificar se as configurações existem e removê-las quando necessário — tudo 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 valores de configuração internamente. Implemente todos os quatro métodos mágicos de propriedade:
    • __get($name) — Retorna o valor para a chave fornecida, ou "undefined" se a chave não existir
    • __set($name, $value) — Armazena o valor sob a 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() — saída "exists" ou "missing"
    • Imprima o valor da primeira configuração
    • Imprima a contagem atual de configurações
    • Use unset() para remover a primeira configuração
    • Imprima se a primeira configuração existe agora — saída "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 que você interaja com seu objeto Config usando a sintaxe natural de propriedade, como $config->theme = "dark" e isset($config->theme), mesmo que nenhuma propriedade real esteja definida.

Folha de consulta

O PHP fornece quatro métodos mágicos para interceptar o acesso a propriedades:

  • __get(string $name): mixed — Chamado ao ler uma propriedade inacessível
  • __set(string $name, mixed $value): void — Chamado ao escrever em uma propriedade inacessível
  • __isset(string $name): bool — Acionado por isset() ou empty()
  • __unset(string $name): void — Acionado por unset()

Exemplo de __get() e __set():

<?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";
echo $obj->title; // Hello

Exemplo de __isset() e __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"; // exists

Esses métodos permitem propriedades dinâmicas, lazy loading e contêineres de dados flexíveis, mantendo a estrutura orientada a objetos.

Experimente você mesmo

<?php

require_once 'Config.php';

// Ler entradas
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));

// TODO: Criar uma instância de Config

// TODO: Definir a primeira configuração com o valor fornecido

// TODO: Imprimir se a primeira configuração existe ("exists" ou "missing")

// TODO: Imprimir o valor da primeira configuração

// TODO: Imprimir a contagem atual de configurações

// TODO: Usar unset() para remover a primeira configuração

// TODO: Imprimir se a primeira configuração existe agora ("exists" ou "missing")

// TODO: Imprimir 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