Вы не можете делать то, о чем просите; но вы можете «обмануть», используя тот факт, что в 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);
}
И теперь становится возможным использовать однострочник, как вы и просили - единственное, что вы вызываете функцию, тем самым не используя new:
$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]