Non puoi fare ciò che stai chiedendo; ma puoi "ingannare", usando il fatto che, in PHP, puoi avere una funzione che ha lo stesso nome di una classe; quei nomi non entreranno in conflitto.
Quindi, se avete dichiarato una classe come questa:
class Test {
public function __construct($param) {
$this->_var = $param;
}
public function myMethod() {
return $this->_var * 2;
}
protected $_var;
}
È quindi possibile dichiarare una funzione che restituisce un'istanza di quella classe - e ha esattamente lo stesso nome della classe:
function Test($param) {
return new Test($param);
}
Ed ora, diventa possibile utilizzare un one-liner, come hai chiesto - unica cosa è che si sta chiamando la funzione, quindi non utilizzando il nuovo:
$a = Test(10)->myMethod();
var_dump($a);
E funziona: qui, mi sto:
int 20
come output.
E, meglio, si può mettere un po 'phpdoc sulla vostra funzione:
/**
* @return Test
*/
function Test($param) {
return new Test($param);
}
In questo modo, potrai anche avere osservazioni in vostro IDE - almeno, con Eclipse PDT 2.x; vedere la screeshot:
http://extern.pascal-martin.fr/so/class-and-function.png
Edit 2010-11-30: Solo per informazioni, un nuovo RFC è stata presentata, pochi giorni fa, che si propone di aggiungere questa funzione per una delle future versioni di PHP.
See: Request for Comments: Instance and method call/property access
Così, magari facendo le cose come queste sarà possibile in PHP 5.4 o un altro futuro versione:
(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]
btw, se non si utilizza 5.4 (che probabilmente non lo sono), è possibile definire una funzione di supporto che restituisce appena un oggetto alla catena di cose ... funzione con ($ obj) {return $ obj; } (ho preso il trucco da laravel: P) .. quindi puoi fare con (nuovo Obj) -> method() – kapv89
Semplice come '(new Object()) -> doSomething()'. –