No puede hacer lo que está pidiendo; pero puede "engañar", usando el hecho de que, en PHP, puede tener una función que tiene el mismo nombre que una clase; esos nombres no entrarán en conflicto.
lo tanto, si usted declaró una clase como esta:
class Test {
public function __construct($param) {
$this->_var = $param;
}
public function myMethod() {
return $this->_var * 2;
}
protected $_var;
}
Luego, puede declarar una función que devuelve una instancia de esa clase - y tiene exactamente el mismo nombre que la clase:
function Test($param) {
return new Test($param);
}
Y ahora, se hace posible usar una sola línea, como lo pediste - lo único que se está llamando a la función, por tanto, no con nuevas:
$a = Test(10)->myMethod();
var_dump($a);
Y funciona: aquí, yo estoy haciendo:
int 20
como salida.
Y, mejor, puede poner un poco de phpdoc en su función:
/**
* @return Test
*/
function Test($param) {
return new Test($param);
}
De esta manera, podrás incluso tienen indicios en su IDE - al menos, con Eclipse PDT 2.x; ver el Screeshot:
http://extern.pascal-martin.fr/so/class-and-function.png
Editar 2010-11-30: Sólo a título informativo, un nuevo RFC se ha presentado, hace unos días, que propone añadir esta característica a una de las versiones futuras de PHP.
Ver: Request for Comments: Instance and method call/property access
Así, tal vez haciendo cosas como éstas será posible en PHP 5.4 u otra versión futura:
(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]
Por cierto, si no está utilizando 5.4 (que probablemente no sea), puede definir una función de ayuda que simplemente devuelve un objeto para encadenar cosas ... función con ($ obj) {return $ obj; } (recogió el truco desde laravel: P) .. luego puede hacer con (nuevo Obj) -> método() – kapv89
Tan simple como '(new Object()) -> doSomething()'. –