内联 PHP 克隆

14

在尝试使用PHP 5.2.9时进行此操作:

$foo = (clone $template)->bar();

PHP 给我一个语法错误:

Parser error "';' expected after expression (Found token: ->)"

我是不是做错了什么?还是根本没有办法内联克隆一个对象,以至于我必须将语句拆分成两行?


1
我不记得具体细节,但是旧版本的PHP在处理一些与对象属性相关的表达式时存在问题。也许这就是其中之一?你能升级你的PHP版本吗? - Brad
2
@Brad 最新的PHP版本也有同样的问题,但错误不同。 - Florent
2
PHP 7现在支持此功能 https://3v4l.org/D5Vd9 - Petah
5个回答

11

很遗憾,PHP不允许使用那种语法(在任何一个版本中都不支持)。如果想要避免把代码分成两行,你可以这样做:

$foo = call_user_func(array(clone $template, 'bar'));

1
真遗憾,我以为 PHP 在 5 版本中已经克服了那些怪异的问题。我会考虑使用 call_user_function 版本的。;-) - Thomas Ahle
我觉得没有其他方法可以将这个变成一行代码。如果有的话,我也不知道是什么 :) - gen_Eric
希望这个功能能够被添加到PHP 7中。 - Stuart Wagner

3
class X {
    public function foo(){
        echo 'inline clone';
    }
}

$x = new X;

$y = clone $x and $y->foo(); // "inline clone"

0

这只能在 PHP 5.4.0 及以上版本使用。

阅读变更日志:

添加了类成员实例化访问(例如,(new foo)->bar())支持。


6
很遗憾,这个语法只适用于 new。它不适用于 clone https://eval.in/123192 :(。 - gen_Eric

0

作为一种解决方法,您可以创建一个函数来克隆一个变量:

$clone = function ($value) {
    return clone $value;
};

$foo = $clone($template);

0
$newObject = (clone $objectToClone);

(在旧版本的PHP中无法运行,但在7.x版本以上是可以的)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接