Hoje eu estava lendo o livro DSL em Ação, da mannings. Então, em algum lugar ao longo do caminho, me perguntei se poderia usar funções anônimas como métodos em uma classe.
Tentativa de POC:
class ClassFoo{
$foo_anonymous = function(){
echo 'Obama';
}
}
Tentei executar o script, o resultado não foi agradável para mim:
Parse error: syntax error, unexpected '$foo_anonymous' (T_VARIABLE), expecting function (T_FUNCTION) in ...
Triste e desapontado. Eu queria encontrar uma alternativa, uma solução.
Primeiro pensei em usar __call (), depois imaginei que tipo de pesadelo pode ser … Então, joguei a primeira ideia pela janela.
Segunda tentativa, tentei entender o que estava errado. Pela mensagem de erro, o analisador PHP era muito estúpido para entender, eu quero uma função anônima em uma classe. Então, tento escrever um wrapper de função estúpido para lidar com a estupidez do PHP.
class ClassFoo{
public function __construct(){
$this->stupid_wrapper();
}
public function stupid_wrapper(){
$this->foo = function(){
echo "Dropbox";
};
$this->foo2 = function(){
echo "Condoleezza Rice";
};
}
}
O script foi executado, agora preciso acessar o método.
// First attempt to access method
$classfoo = new ClassFoo;
$classfoo->foo();
// $classfoo->foo; //nothing, also doesnt call the anonymous method
Fatal error: Call to undefined method ClassFoo::foo()
PHP não vê meu método. Sem escolha, mas precisa ser um pouco prolixo para acessar o método anônimo.
$classfoo = new ClassFoo;
$foo = $classfoo->foo;
$foo2 = $classfoo->foo2;
$foo();
$foo2();
Funciona, resultado: DropboxCondoleezza Rice
Conclusão:
- O método anônimo pode ser usado em classes PHP, mas você precisa de um wrapper fino em torno dele. Porque há uma limitação da sintaxe de função anônima do PHP no contexto de uma classe PHP.
Discussões:
Não tenho certeza em que contexto os métodos anônimos podem ser úteis. Se você tem uma ideia, por favor me esclareça.
Fechamentos são objetos em PHP. Talvez haja algum tipo de impacto no desempenho ao usá-lo assim no PHP. Eu ainda não sei.
O objeto é muito decomposto nesta configuração. Você pode sobrecarregar e substituir métodos com muita facilidade.
Você pode perder a capacidade de usar palavras-chave modificadoras como privado, protegido para seus métodos. Isso depende se você declara suas variáveis ​​de antemão.
Qualquer outra coisa que você sabe, me esclareça.
Se você achar que esta é uma boa leitura, dê-me um polegar para cima.
Obrigado.