4

有没有办法在临时声明的对象上调用方法,而不会被迫将第一个对象分配给变量?

见下文:

class Test
{
   private $i = 7;      
   public function get() {return $this->i;}   
}

$temp = new Test();
echo $temp->get(); //ok

echo new Test()->get(); //invalid syntax
echo {new Test()}->get(); //invalid syntax
echo ${new Test()}->get(); //invalid syntax
4

9 回答 9

8

当我想要这种行为时,我使用以下解决方法。

我声明了这个函数(在全局范围内):

function take($that) { return $that; }

然后我以这种方式使用它:

echo take(new Test())->get();
于 2010-02-07T19:52:25.413 回答
7

你能做的是

class Test
{
   private $i = 7;      
   public function get() {return $this->i;}

   public static function getNew() { return new self(); }
}

echo Test::getNew()->get();
于 2010-02-07T18:02:21.737 回答
4

为什么不这样做:

class Test
{
   private static $i = 7;      
   public static function get() {return self::$i;}   
}

$value = Test::get();
于 2010-02-07T18:06:26.217 回答
3

不幸的是,你不能这样做。恐怕PHP就是这样。

于 2010-02-07T17:55:14.887 回答
3

不,这是 PHP 解析器的限制。

于 2010-02-07T17:55:50.093 回答
2

我经常使用这个方便的小功能

 function make($klass) {
    $_ = func_get_args();
    if(count($_) < 2)
        return new $klass;
    $c = new ReflectionClass($klass);
    return $c->newInstanceArgs(array_slice($_, 1));
 }

用法

make('SomeCLass')->method();

或者

make('SomeClass', arg1, arg2)->foobar();
于 2010-02-07T18:44:21.573 回答
1

不可能,你为什么要以这种方式创建一个对象?

对象的意义在于封装唯一的状态。在您给出的示例中,$i将始终为 7,因此创建对象,然后$i从中获取然后将对象丢失给垃圾收集器,因为在$i返回后没有对该对象的引用,这是没有意义的。静态类,如其他地方所示,对此目的更有意义。或者关闭。

相关主题:

于 2010-02-07T17:55:48.363 回答
1

这是一个老问题:我只是提供一个更新的答案。

在所有受支持的 PHP 版本中(自 5.4.0 起,2012 年),您可以这样做:

(new Test())->get();

请参阅https://secure.php.net/manual/en/migration54.new-features.php(“实例化时的类成员访问”)。

于 2016-08-04T09:19:29.260 回答
0

这最近出现在 php-internals 上,不幸的是,一些活跃在 PHP 开发中的有影响力的人(例如狙击手)反对该功能。发送电子邮件至 php-internals@lists.php.net,让他们知道您是一名成年程序员。

于 2010-02-07T19:32:54.657 回答