在 PHP 中,是否可以在同一行上实例化对象并调用方法?

2022-08-30 06:53:10

我想做的是这样的:

$method_result = new Obj()->method();

而不必做:

$obj = new Obj();
$method_result = $obj->method();

在我的具体案例中,结果对我来说并不重要。但是,有没有办法做到这一点?


答案 1

您要求的功能可从 PHP 5.4 获得。以下是 PHP 5.4 中的新功能列表:

https://php-legacy-docs.zend.com/manual/php5/en/migration54.new-features

以及新功能列表中的相关部分:

已添加实例化时的类成员访问权限,例如(new Foo)->bar().


答案 2

你不能做你要求的事情;但是你可以“作弊”,利用这样一个事实,即在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]

推荐