Sintaxe do PHP: o que eles estavam pensando?
Alguns dias atrás estava atrás da resposta para uma dúvida que atormentava minha alma: por que diabos isto não é válido em PHP5?
new MyClass()->some_method()->other_method();
Ou isso, caso o problema seja aquele new no caminho:
(new MyClass())->some_method()->other_method();
“Isto o quê?”, você me pergunta. Formulando novamente a pergunta: por quê não é possível encadear uma chamada de método a uma instância recém-criada, sem ter que associar essa instância a uma variável?. É verdade, a situação já foi pior. Voltemos aos dias do PHP4 (muitos ainda continuam lá, é verdade). O código abaixo seria inválido:
$obj = new MyClass();
$obj->some_method()->other_method();
Sim, no PHP4 ainda não era permitido o encadeamento de chamadas de métodos. E no PHP5 o PHP nos dá isso, mas pela metade, afinal o exemplo inicial do post não é válido.
Esta discussão propõe várias técnicas para passar por cima desse problema, mas são todas gambiarras, nada mais que isso. Assino a lista dos desenvolvedores do PHP mas ainda não vi nenhuma discussão a respeito, então é possível que os que sentem falta disso sejam a minoria. Será?
Como faríamos isso em Python?
MyClass().some_method().other_method()
Trivial, não? Em Ruby?
MyClass.new.some_method.other_method
Tão trivial quanto. Mas se você está com o PHP, ria pra não chorar. Já
não basta ter que digitar dois caracteres (->) no lugar de um (.)
para enviar mensagens a objetos, ainda temos que agüentar esse tipo
de falha/esquecimento/sei-lá-o-quê na sintaxe da linguagem? Estamos
perdidos.

February 19th, 2008 às 1:08 pm
Tipo isso. Programadores PHP já me tacaram tomates por criticar essa limitação, se bem me lembro.
[]’s Thiago
February 28th, 2008 às 11:08 pm
Interessante, nem imaginava que PHP não permitia essa construção, rss… Mas deve ser a implementação de PHP que não é tão OO — não que OO seja assim incontestável. Acho que quando uma instância é criada em PHP ela não retorna um objeto mas apenas é inserida numa variável. Assim, quando se chamam os métodos eles não partem de alguma coisa que retornou pq não houve retorno.
Falando nisso, lembro que já debuguei códigos meus que davam erro ao tentar fazer algo assim em Python: list().sort().append(1) –> Levanta uma excepetion. O método sort() retorna “None”, o que ele faz é alterar o próprio objeto ‘list’. Quiséssemos fazer isso deveria ser: sorted(list()).append(1).
February 29th, 2008 às 8:33 am
De fato não sei exatamente o quê o construtor do PHP retorna, talvez ele realmente não retorne nada, e uma mágica aconteça e apenas a variável do lado esquerdo da atribuição receba uma referência para o novo objeto… de qualquer modo me parece uma péssima idéia. Legal você apontar características semelhantes (e tão estranhas quanto) no Python. Todas as linguagens tem seus “gotchas”, afinal.
June 25th, 2008 às 9:40 am
Umas das coisas mais legais que eu achava quando lançaram o PHP5 era essa possibilidade, quando vi que na instanciação do objeto não rolava fiquei muito de cara.
Mas é essa apenas uma das coisas básicas que o PHP viaja na implementação, mas é como o Eduardo disse, cada linguagem tem uma viagem diferente, umas mais outras menos
abraço
June 25th, 2008 às 9:42 am
“cada linguagem tem uma viagem diferente, umas mais outras menos”
Sem dúvida!