Sie können nicht tun, was Sie verlangen; Sie können jedoch "betrügen", indem Sie in PHP eine Funktion verwenden, die denselben Namen wie eine Klasse hat. Diese Namen werden nicht in Konflikt geraten.
Wenn Sie also eine Klasse wie diese deklariert haben:
class Test {
public function __construct($param) {
$this->_var = $param;
}
public function myMethod() {
return $this->_var * 2;
}
protected $_var;
}
Sie können dann eine Funktion deklarieren, die eine Instanz dieser Klasse zurückgibt - und genau denselben Namen wie die Klasse hat:
function Test($param) {
return new Test($param);
}
Und jetzt wird es möglich, einen Einzeiler zu verwenden, wie Sie gefragt haben - nur rufen Sie die Funktion auf und verwenden daher nicht new:
$a = Test(10)->myMethod();
var_dump($a);
Und es funktioniert: hier bekomme ich:
int 20
als Ausgabe.
Und besser, Sie können Ihre Funktion mit Phpdoc versehen:
/**
* @return Test
*/
function Test($param) {
return new Test($param);
}
Auf diese Weise haben Sie sogar Hinweise in Ihrer IDE - zumindest mit Eclipse PDT 2.x; siehe den Screeshot:
Bearbeiten 30.11.2010: Nur zur Information wurde vor einigen Tagen ein neuer RFC eingereicht, der vorschlägt, diese Funktion einer der zukünftigen Versionen von PHP hinzuzufügen.
Siehe: Anforderung von Kommentaren: Instanz- und Methodenaufruf / Eigenschaftszugriff
Vielleicht ist es in PHP 5.4 oder einer anderen zukünftigen Version möglich, solche Dinge zu tun:
(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]