Ви не можете робити те, що просите; але ви можете «обдурити», використовуючи той факт, що в PHP ви можете мати функцію, яка має те саме ім’я, що і клас; ці імена не будуть конфліктувати.
Отже, якщо ви оголосили такий клас:
class Test {
public function __construct($param) {
$this->_var = $param;
}
public function myMethod() {
return $this->_var * 2;
}
protected $_var;
}
Потім ви можете оголосити функцію, яка повертає екземпляр цього класу - і має точно те саме ім'я, що і клас:
function Test($param) {
return new Test($param);
}
І тепер стає можливим використовувати однолінійний лайнер, як ви просили - єдине, що ви викликаєте функцію, таким чином, не використовуючи нову:
$a = Test(10)->myMethod();
var_dump($a);
І це працює: ось, я отримую:
int 20
як вихід.
І, краще, ви можете поставити phpdoc про свою функцію:
/**
* @return Test
*/
function Test($param) {
return new Test($param);
}
Таким чином, ви навіть матимете підказки у своїй IDE - принаймні, з Eclipse PDT 2.x; дивіться знімок:
Редагувати 2010-11-30: Щойно для інформації, кілька днів тому було подано новий RFC, який пропонує додати цю функцію до однієї з майбутніх версій PHP.
Див.: Запит на коментарі: Виклик примірника та доступ до власності / власності
Тож, можливо, такі дії будуть можливі в PHP 5.4 або іншій майбутній версії:
(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]