Sobes.tech
Junior

O que são métodos mágicos em PHP?

sobes.tech IA

Resposta da IA

Os métodos mágicos em PHP são métodos especiais que são chamados automaticamente em certas circunstâncias. Os seus nomes começam com dois underlines (__).

Lista dos principais métodos mágicos:

  • __construct(): É chamado ao criar um novo objeto.
  • __destruct(): É chamado ao destruir um objeto.
  • __call($name, $arguments): É chamado ao tentar invocar um método do objeto que não está acessível ou não existe.
  • __callStatic($name, $arguments): É chamado ao tentar invocar um método estático que não está acessível ou não existe.
  • __get($name): É chamado ao tentar obter o valor de uma propriedade inacessível do objeto.
  • __set($name, $value): É chamado ao tentar definir o valor de uma propriedade inacessível do objeto.
  • __isset($name): É chamado ao usar isset() ou empty() numa propriedade inacessível.
  • __unset($name): É chamado ao usar unset() numa propriedade inacessível.
  • __sleep(): É chamado antes da serialização, devolve um array com os nomes das propriedades a serializar.
  • __wakeup(): É chamado após a deserialização.
  • __toString(): Permite que o objeto se comporte como uma string quando usado num contexto de string.
  • __invoke($args): É chamado quando o script tenta invocar o objeto como uma função.
  • __set_state(array $properties): É chamado ao exportar um objeto com a função var_export().
  • __clone(): É chamado após a clonagem do objeto para configurar a cópia.
  • __serialize(): É chamado durante a serialização, devolve um array de dados para serializar.
  • __unserialize(array $data): É chamado durante a deserialização, recebe os dados de __serialize().

Exemplo de uso de __construct e __destruct:

<?php
class Example {
    public function __construct() {
        echo "Objeto criado\n";
    }

    public function __destruct() {
        echo "Objeto destruído\n";
    }
}

$obj = new Example();
unset($obj); // Destrói o objeto de forma forçada
?>

Exemplo de uso de __get e __set:

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

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

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

$store = new DataStore();
$store->name = "Alice"; // Chama __set
echo $store->name; // Chama __get
?>