Palavras-chave: PHP, __call, métodos dinâmicos, orientação a objetos

O PHP tem uma função mágica chamada __call(). Se sua classe declarar um método com este nome, ele será invocado sempre que for feita uma chamada a um método não existente naquela classe.

Esta invocação receberá como parâmetro o nome do método chamado e os argumentos. É um mecanismo tradicional e simples, mas muito poderoso. Já existia no Smalltalk, através da mensagem doesNotUnderstand, que tinha exatamente a mesma semântica.

As aplicações são diversas: interceptação de chamadas, proxying, dynamic dispatching etc. Estas brincadeiras divertidas são muito úteis para a construção de bibliotecas e frameworks dinâmicos, por exemplo, para web ou mapeamento objeto-relacional.

Um exemplo para ilustrar:

class ClasseComTodosOsMetodosDoMundo
{
    public function __call($m, $a)
    {
        echo "Método invocado: $m\n";
    }
}

$o = new ClasseComTodosOsMetodosDoMundo();
$o->umMetodoQualquer();
$o->umMetodoAssimAssado();

Que vai ter a saída:

Método invocado: umMetodoQualquer
Método invocado: umMetodoAssimAssado