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