【问题标题】:Inline PHP clone内联 PHP 克隆
【发布时间】:2014-04-26 01:29:06
【问题描述】:

在 PHP 5.2.9 中尝试这样做时:

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

PHP 给我一个语法错误:

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

我做错了吗?还是根本没有办法内联克隆对象,这样我就不得不将我的语句分成两行?

【问题讨论】:

  • 我不记得细节了,但是旧版本的 PHP 在某些与对象属性相关的表达式方面存在问题。也许这是其中之一?你能升级你的PHP版本吗?
  • @Brad 与较新的 PHP 版本相同的问题,但错误不同。
  • PHP 7 现在支持3v4l.org/D5Vd9

标签: php clone inline


【解决方案1】:

不幸的是,PHP 不允许这种语法(在任何版本中)。作为将其分成两行的替代方法,您可以这样做:

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

【讨论】:

  • 太糟糕了,我认为 PHP 已经在第 5 版中克服了这些奇怪之处。我会考虑使用 call_user_function 版本 ;-)
  • 我认为没有其他方法可以将其单行。或者如果有,我不知道它是什么:)
  • 希望在 PHP 7 中添加此功能。
【解决方案2】:
class X {
    public function foo(){
        echo 'inline clone';
    }
}

$x = new X;

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

【讨论】:

    【解决方案3】:

    这仅适用于 PHP 5.4.0

    阅读更新日志:

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

    【讨论】:

    • 不幸的是,这种语法只适用于new。它不适用于clone eval.in/123192 :(
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-17
      • 2012-12-02
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      相关资源
      最近更新 更多