O que eu gostaria de fazer é algo como isto:
$method_result = new Obj()->method();
Em vez de ter que fazer:
$obj = new Obj();
$method_result = $obj->method();
O resultado realmente não importa para mim no meu caso específico. Mas, existe uma maneira de fazer isso?
my_method
deve ou não ser declaradostatic
.Respostas:
O recurso que você solicitou está disponível no PHP 5.4. Aqui está a lista de novos recursos no PHP 5.4:
http://php.net/manual/en/migration54.new-features.php
E a parte relevante da lista de novos recursos:
fonte
(new Foo)->property
se quiser.(new Foo)->property
- o valor que você está armazenando não tem para onde ir porque o objeto não existirá mais depois disso, pois não será armazenado em nenhum lugar.return $this
aos seus setters. Isso também permitirá que você encadeie os setters.Você não pode fazer o que está pedindo; mas você pode "trapacear", usando o fato de que, no PHP, você pode ter uma função que tem o mesmo nome que uma classe; esses nomes não entrarão em conflito.
Portanto, se você declarou uma classe como esta:
Você pode declarar uma função que retorna uma instância dessa classe - e tem exatamente o mesmo nome da classe:
E agora, torna-se possível usar uma linha, como você perguntou - a única coisa é que você está chamando a função, portanto, não usando new:
E funciona: aqui estou recebendo:
como saída.
E, melhor, você pode colocar algum phpdoc em sua função:
Dessa forma, você ainda terá dicas em seu IDE - pelo menos, com o Eclipse PDT 2.x; veja o screeshot:
Edit 30/11/2010: Apenas para informação, um novo RFC foi enviado há alguns dias atrás que propõe adicionar esse recurso a uma das futuras versões do PHP.
Consulte: Solicitação de comentários: acesso à instância e chamada de método / propriedade
Então, talvez fazer coisas como essas seja possível no PHP 5.4 ou em outra versão futura:
fonte
Você pode fazer isso de maneira mais universal, definindo uma função de identidade:
Dessa forma, você não precisa definir uma função para cada classe.
fonte
E se:
: P
fonte
Não, isso não é possível.
Você precisa atribuir a instância a uma variável antes de poder chamar qualquer um de seus métodos.
Se você realmente não quiser fazer isso, poderá usar uma fábrica, como sugere a ropstah:
fonte
public static function
vez depublic function
. É recomendado o uso de estática?Você pode usar um método estático de fábrica para produzir o objeto:
fonte
Eu também estava procurando uma linha única para fazer isso como parte de uma única expressão para converter datas de um formato para outro. Eu gosto de fazer isso em uma única linha de código, porque é uma única operação lógica. Portanto, isso é um pouco enigmático, mas permite instanciar e usar um objeto de data em uma única linha:
Outra maneira de converter em uma linha as seqüências de datas de um formato para outro é usar uma função auxiliar para gerenciar as partes OO do código:
Eu acho que a abordagem orientada a objetos é legal e necessária, mas às vezes pode ser entediante, exigindo muitas etapas para realizar operações simples.
fonte
Vejo que isso é bastante antigo quanto às perguntas, mas aqui está algo que acho que deve ser mencionado:
O método de classe especial chamado "__call ()" pode ser usado para criar novos itens dentro de uma classe. Você o usa assim:
A saída deve ser:
Assim, você pode enganar o PHP para criar um comando "novo" dentro de sua classe de nível superior (ou qualquer classe realmente) e colocar seu comando de inclusão na função __call () para incluir a classe que você solicitou. Obviamente, você provavelmente desejaria testar o $ func para se certificar de que é um comando "novo" enviado ao comando __call () e (é claro) que você poderia ter outros comandos também por causa do funcionamento do __call ().
fonte
Simplesmente podemos fazer isso
fonte