Sintaxe do PHP: o que eles estavam pensando?

Em: 18/02/2008 Tags: Referencie do seu blog (Trackback)

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.

Artigos relacionados:

5 respostas para “Sintaxe do PHP: o que eles estavam pensando?”

  1. Thiago Silva disse:

    Tipo isso. Programadores PHP já me tacaram tomates por criticar essa limitação, se bem me lembro.

    []’s Thiago

  2. eduardo willians disse:

    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).

  3. Caio Moritz Ronchi disse:

    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.

  4. Rafael Souza disse:

    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

  5. Caio Moritz Ronchi disse:

    “cada linguagem tem uma viagem diferente, umas mais outras menos”

    Sem dúvida!

Escreva um comentário (utilize o formato Markdown)