在 PHP 中,是否可以在同一行上实例化对象并调用方法?
我想做的是这样的:
$method_result = new Obj()->method();
而不必做:
$obj = new Obj();
$method_result = $obj->method();
在我的具体案例中,结果对我来说并不重要。但是,有没有办法做到这一点?
我想做的是这样的:
$method_result = new Obj()->method();
而不必做:
$obj = new Obj();
$method_result = $obj->method();
在我的具体案例中,结果对我来说并不重要。但是,有没有办法做到这一点?
您要求的功能可从 PHP 5.4 获得。以下是 PHP 5.4 中的新功能列表:
https://php-legacy-docs.zend.com/manual/php5/en/migration54.new-features
以及新功能列表中的相关部分:
已添加实例化时的类成员访问权限,例如
(new Foo)->bar().
你不能做你要求的事情;但是你可以“作弊”,利用这样一个事实,即在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]