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







6 comentários
Feed de comentários deste artigo
29 setembro 2007 às 17:19
rascunho » Blog Archive » links for 2007-09-29
[...] PHP: Interceptar métodos inexistentes (__call) « CODARE (tags: codare.net 2007 mes8 dia28 PHP dicas blog_post __call) [...]
8 outubro 2007 às 12:57
Rael
A única coisa que conta “contra” isso é o fato dos editores como Zend e PDT não terem como “auto-completar” ou listar os métodos existentes.
8 outubro 2007 às 15:48
Victor
É o mesmo que o method_missing de Ruby. :-)
22 novembro 2007 às 16:48
Tiago Albineli Motta
Muito bom!
31 janeiro 2008 às 17:46
Ana
No te voy a poder contestar en portugues y he de decir que tu nivel de español es realmente bueno..! Tampoco te hablaré de Java.. pero te mando un beso desde Bilbao, hasta siempre pecoso!
Ana
2 janeiro 2010 às 21:11
Anibal Sólon
Complementando, no PHP 5.3 foi implementado o método __callStatic, para quando for chamado um método de forma estática não-declarado, chame esta função:
$obj->funcaoInexistente(); // chama o __call
ObjetoSobrecarregado::funcaoInexistente(); // chama o __callStatic