Nie możesz zrobić tego, o co prosisz; ale możesz "oszukiwać", wykorzystując fakt, że w PHP możesz mieć funkcję, która ma taką samą nazwę jak klasa; te nazwy nie będą w konflikcie.
Tak więc, jeśli zadeklarowana klasę tak:
class Test {
public function __construct($param) {
$this->_var = $param;
}
public function myMethod() {
return $this->_var * 2;
}
protected $_var;
}
Następnie można zadeklarować funkcję, która zwraca instancję tej klasy - i ma dokładnie taką samą nazwę jak klasa:
function Test($param) {
return new Test($param);
}
a teraz staje się możliwe użycie jednego-liner, jak prosiłeś - Jedyną rzeczą jest dzwonisz funkcji, więc nie za pomocą nowego:
$a = Test(10)->myMethod();
var_dump($a);
I to działa: tu dostaję:
int 20
jako wyjście.
I lepiej, można umieścić kilka PHPDoc na funkcję:
/**
* @return Test
*/
function Test($param) {
return new Test($param);
}
W ten sposób będziesz mieć nawet podpowiedzi w swoim IDE - przynajmniej z Eclipse PDT 2.x; zobacz screeshot:
http://extern.pascal-martin.fr/so/class-and-function.png
Edit 2010-11-30: Tylko dla informacji, nowy RFC został złożony kilka dni temu, że proponuje dodanie ta funkcja do jednej z przyszłych wersji PHP.
Patrz: Request for Comments: Instance and method call/property access
Więc może robić takie rzeczy jak to będzie możliwe w PHP 5.4 lub innej przyszłej wersji:
(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]
btw, jeśli nie używasz 5.4 (co prawdopodobnie nie jest), możesz zdefiniować funkcję pomocniczą, która właśnie zwraca obiekt, aby połączyć łańcuch ... funkcja z ($ obj) {return $ obj; } (podniosła sztuczkę z laravel: P) .. wtedy możesz zrobić (nowy Obj) -> method() – kapv89
Tak prosty jak '(nowy obiekt()) -> doSomething()'. –