【问题标题】:making a class's static-member a function (closure) does not work使类的静态成员成为函数(闭包)不起作用
【发布时间】:2016-08-29 17:01:06
【问题描述】:

(PHP7) 考虑下面的代码,它试图将一个函数分配给一个变量,然后确保它只被调用一次。

class a{
  static public $b;
  static public function init(){
     self::$b();
     self::$b=function(){};
  }
}
a::$b=function(){echo 'Here I do very heavy stuff, but will happen only in the first time I call init()';};

for($i=0;$i<1000;$i++){
   a::init();
}

在 php7 中它会给出一个错误,它期望 a::$b 是一个字符串(要调用的函数名)。
如果我使用纯变量而不是静态成员,它将起作用。
我的问题是,这是否可以工作,或者我可以做一些小的调整以使其工作没有纯变量

【问题讨论】:

  • 此代码在 PHP 5 或 PHP 7 中都不起作用。
  • 是的,我知道,但不应该吗? (即错误或功能请求?)
  • 这不是错误。它在 PHP 5 中从未工作过。当您正确使用统一变量语法时,它在 PHP 7 中工作。即(self::$b)()
  • 这可能是关于统一变量语法的一件事,不幸的是不会向后兼容 PHP 5。
  • 我在两周内完成了 php5 :-)

标签: php lambda functional-programming php-7


【解决方案1】:

您可以使用 PHP 7 Uniform Variable Syntax:

(self::$b)();

或者PHP 5+(包括7)中的临时变量:

$init = self::$b;
$init();

As seen on 3v4l.org.

【讨论】:

  • 我确实用临时变量解决了这个问题。效果很好。我想我会做统一的语法,看起来更干净。
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多