Sobes.tech
Junior

Que métodos mágicos de classes conhece?

sobes.tech IA

Resposta da IA

Os métodos mágicos em PHP são métodos especiais que são chamados automaticamente em eventos específicos. Começam com __ (duplo sublinhado).

Principais métodos mágicos:

  • __construct(): É chamado ao criar uma nova instância da classe. Usado para inicializar o objeto.
  • __destruct(): É chamado ao remover um objeto ou ao terminar o script. Usado para liberar recursos.
  • __call(string $name, array $arguments): É chamado ao tentar invocar um método inacessível ou inexistente.
  • __callStatic(string $name, array $arguments): É chamado ao tentar invocar um método estático inacessível ou inexistente.
  • __get(string $name): É chamado ao tentar aceder a uma propriedade inacessível ou inexistente.
  • __set(string $name, mixed $value): É chamado ao tentar definir um valor para uma propriedade inacessível ou inexistente.
  • __isset(string $name): É chamado ao usar isset() ou empty() numa propriedade inacessível ou inexistente.
  • __unset(string $name): É chamado ao usar unset() numa propriedade inacessível ou inexistente.
  • __serialize(): É chamado antes de serializar o objeto com serialize(). Retorna um array de propriedades para serialização.
  • __unserialize(array $data): É chamado ao deserializar o objeto com unserialize(). Recebe um array de dados para restaurar as propriedades.
  • __toString(): Permite tratar o objeto como uma string. É chamado ao tentar imprimir o objeto como string (por exemplo, com echo). Deve retornar uma string.
  • __invoke(...$arguments): Permite tratar o objeto como uma função. É chamado ao tentar invocar o objeto como uma função.
  • __set_state(array $properties): É chamado ao restaurar o objeto com var_export(). Recebe um array de propriedades do objeto.
  • __debugInfo(): É chamado ao usar var_dump() num objeto. Deve retornar um array com informações para depuração.

Exemplo de uso de __construct e __toString:

<?php
class MyClass {
    private $name;

    public function __construct(string $name) {
        $this->name = $name;
    }

    public function __toString(): string {
        return "Objeto com nome: " . $this->name;
    }
}

$obj = new MyClass("Teste");
echo $obj; // Vai chamar __toString()

Exemplo de uso de __get e __set:

<?php
class MyClass {
    private $data = [];

    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }

    public function __get(string $name): mixed {
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        return null; // Ou lançar uma exceção
    }
}

$obj = new MyClass();
$obj->prop1 = "Valor 1"; // Vai chamar __set()
echo $obj->prop1; // Vai chamar __get()