在PHP中,你可以实例化一个对象,并调用在同一行的方法?(In PHP, can you insta

2019-07-17 13:54发布

我想这样做是这样的:

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

而不必做的:

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

结果实际上并不重要,我在我的具体情况。 但是,有没有办法做到这一点?

Answer 1:

你已要求该功能可从PHP 5.4。 这里是在PHP 5.4的新特性列表:

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

而相关的部分来自新功能列表:

上实例化类的成员访问已被添加, 例如,(新的Foo) - >巴()。



Answer 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);
}

而现在,它变成可以使用的一行,就像你问 - 唯一的事情是你调用的函数,因此不使用新的:

$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:



2010-11-30编辑:只是为了信息,一个新的RFC已提交,几天前,该建议将此功能添加到PHP的未来版本中的一个。

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

所以,也许在做这样的事情会在PHP 5.4或其他未来的版本中可能的:

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


Answer 3:

怎么样:

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

:P



Answer 4:

您可以通过定义一个身份功能做的更加普遍:

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

identity(new Obj)->method();

这样,你就不需要定义一个函数为每个类。



Answer 5:

不,这是不可能的。
您需要将实例分配给一个变量,然后才能调用任何它的方法。

如果你真的wan't这样做,因为ropstah建议你可以使用一个工厂:

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


Answer 6:

你可以使用一个静态工厂方法来产生对象:

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


Answer 7:

我也一直在寻找一个班轮做到这一点作为一个表达式的一部分从一种格式转换日期到另一个。 我喜欢在一个单一的代码行这样做,因为它是一个单一的逻辑运算。 所以,这是一个有点神秘,但它可以让你实例化和单行中使用的日期对象:

$newDateString = ($d = new DateTime('2011-08-30') ? $d->format('F d, Y') : '');

另一种方法是一个行日期字符串从一种格式转换为另一种是使用一个辅助功能,可管理代码的OO部分:

function convertDate($oldDateString,$newDateFormatString) {
    $d = new DateTime($oldDateString);
    return $d->format($newDateFormatString);
}

$myNewDate = convertDate($myOldDate,'F d, Y');

我认为面向对象的方法是凉的和必要的,但有时也可能是乏味的,需要太多的步骤来完成简单的操作。



Answer 8:

我认为这是很老的问题去,但这里是我认为应该提到:

“__call()”可用于所谓的专用类方法,创建一个类内部的新项目。 您可以使用这样的:

<?php
class test
{

function __call($func,$args)
{
    echo "I am here - $func\n";
}

}

    $a = new test();
    $a->new( "My new class" );
?>

输出应该是:

I am here - new

因此,你可以欺骗PHP为使您的顶层类内部的“新建”命令(或任何类别真的),并把您的包括命令到__call()函数,包括你问我的班。 当然,你可能会想测试$ FUNC,以确保它是被送到__call()命令和(当然),你可以有其他的命令也因为__call()是如何工作的“新建”命令。



文章来源: In PHP, can you instantiate an object and call a method on the same line?