1

以下 PHP 代码导致错误:以“say”开头的行出现意外 T_FUNCTION。我使用的是 PHP 5.3.6 版,因此应该支持 lambda,但它不起作用。我也不知道“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); }
            )
        );
}
4

3 回答 3

4

特定于 PHP 5.3.x

首先,不可能将 lambdas 分配为默认属性值(lambdas 不被视为常量表达式)。因此无法直接进行该分配;您需要在构造函数中执行此操作。

其次,在 PHP 5.3.x 中,您不能$this在 lambda 中使用。典型的解决方法是复制$this并捕获它,如下所示:

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

但是,这种方式根本不可能$that从 lambda 内部访问非公共成员,因此该技术不能直接用于您的情况。

您可能应该做的是存储$this->backend在构造函数内的局部变量和uselambda 内的变量中。存储和捕获都可以通过值或引用来完成,具体取决于您是否希望任何修改传播到 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 开始,您可以$this在类方法中定义的 lambda 中隐式使用:

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

无法将 lambda 分配为默认属性值的限制仍然存在。

于 2013-02-03T13:25:31.337 回答
0

问题是

  use($this->backend)

$this您的课程蓝图中尚不存在,因此您绝对不能将其指定为这一点。

您尝试做的事情可能无法在匿名函数中执行,因为它本身不是类的成员,因此无法获取$this 变量。

您可能必须在 的适当成员函数中执行此操作,或作为参数Foo传递。$this

于 2013-02-03T12:58:41.983 回答
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() ...
于 2013-02-03T13:34:08.013 回答