PHP 5.3.6 lambda无法正常工作?

时间:2013-02-03 12:54:10

标签: php lambda closures

以下PHP代码导致错误:以“say”开头的行出现意外的T_FUNCTION。我正在使用PHP版本5.3.6,因此应支持lambdas,但它不起作用。我不知道“use”子句在这种情况下是否有效,但删除它并不能解决问题。我的语法有问题吗?注意:$ this-> backend在构造函数中定义为$ this-> backend = fopen(“bar.txt”,“w +”);

class Foo
{
  private $backend;
  private $commands = array(
        0 => array(
            "say" => function($msg) use($this->backend) { fwrite($this->backend,$msg); }
            )
        );
}

3 个答案:

答案 0 :(得分:4)

特定于PHP 5.3.x

首先,不能将lambdas指定为默认属性值(lambdas不被视为常量表达式)。所以不可能直接进行这项任务;你需要在构造函数中完成它。

其次,在PHP 5.3.x中,你不能在lambda中使用$this。典型的解决方法是制作$this的副本并捕获该副本,如:

$that = $this;
$func = function() use($that) { ... };

但是这样就无法从lambda内部访问$that的非公共成员,所以这种技术不能直接用于你的情况。

你应该做的是将$this->backend存储在构造函数内的局部变量中,并将use存储在lambda中的变量中。存储和捕获都可以通过值或引用来完成,具体取决于您是否希望在lambda之外传播任何修改以及$this->backend的值在调用lambda之前可能发生更改的可能性:

 public function __construct() {
    $backend = $this->backend;
    $this->commands = array(
        'say' => function($msg) use($backend) { fwrite($backend, $msg); }
    );
 }

以后的PHP版本

从PHP 5.4.0开始,您可以在类方法中定义的lambda中隐式使用$this

 public function __construct() {
    $this->commands = array(
        'say' => function($msg) { fwrite($this->backend, $msg); }
    );
 }

lambdas无法指定为默认属性值的限制仍然存在。

答案 1 :(得分:0)

问题是

  use($this->backend)
你的班级蓝图中还不存在

$this,所以你绝对不能指定它。

你想要做的事情在匿名函数中可能是不可能的,因为它不是类的成员,因此不会得到$this变量。

您可能必须使用Foo的正确成员函数执行此操作,或将$this作为参数传递。

答案 2 :(得分:0)

您无法直接从变量或lambda中定义类中的属性;

// these are incorrect
private $foo = $bar
private $callback = function() ...

// correct
define("BAR", "The bar!");

class A {
    private $foo = BAR;
    private $commands = array();
    ...
    public function __construct() {
        $this->commands[0] = function() ...