当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在PHP中,您可以实例化一个对象并在同一行上调用方法吗?》经验,为你挑选了6个好方法。

我想做的是这样的事情:

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

而不是必须做:

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

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



1> Delian Krust..:

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

http://php.net/manual/en/migration54.new-features.php

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

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


请注意,这也意味着如果您愿意,可以执行`(new Foo) - > property`.
@CMCDragonkai逻辑上有意义; 该对象仅存在于语句`(new Foo) - > property`的持续时间内 - 您存储的值无处可去,因为该对象在此之后将不再存在,因为它不存储在任何地方.

2> Pascal MARTI..:

你不能做你所要求的; 但你可以"欺骗",因为在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; 看到screeshot:

http://extern.pascal-martin.fr/so/class-and-function.png



编辑2010-11-30:仅仅是为了获取信息,几天前提交了一个新的RFC,它建议将此功能添加到PHP的未来版本之一.

请参阅:请求注释:实例和方法调用/属性访问

因此,在PHP 5.4或其他未来版本中可能会执行这样的操作:

(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]



3> Jeff..:

怎么样:

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

:P



4> Tom Pažourek..:

您可以通过定义标识函数来更普遍地执行此操作:

function identity($x) {
    return $x;
}

identity(new Obj)->method();

这样您就不需要为每个类定义一个函数.


很好的解决方案,因为它强调这种限制的愚蠢:)

5> Pim Jager..:

不,这是不可能的.
您需要先将实例分配给变量,然后才能调用其中的任何方法.

如果你真的不想这样做,你可以使用工厂作为ropstah建议:

class ObjFactory{
  public static function newObj(){
      return new Obj();
  }
}
ObjFactory::newObj()->method();


Pim的回答是正确的.或者,如果您不想创建对象的实例,则可以使用静态函数

6> Ropstah..:

您可以使用静态工厂方法来生成对象:

ObjectFactory::NewObj()->method();


不需要单独的工厂; 同一个类中的静态方法将完成同样的事情.
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有