PHP5.3.6 lambda不工作?

PHP5.3.6 lambda不工作?,php,lambda,closures,Php,Lambda,Closures,以下PHP代码导致错误:以“say”开头的行上出现意外的T_函数。我使用的是PHPVersion5.3.6,所以应该支持lambdas,但它不起作用。我不知道“use”子句在此上下文中是否有效,但删除它并不能解决问题。我的语法有问题吗?注意:$this->backend在构造函数中定义为$this->backend=fopen(“bar.txt”,“w+”) 问题是 use($this->backend) $this在您的类蓝图中还不存在,因此您绝对不能将其指定为该点 您试图在匿名函

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

问题是

  use($this->backend)
$this
在您的类蓝图中还不存在,因此您绝对不能将其指定为该点

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

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

问题在于

  use($this->backend)
$this
在您的类蓝图中还不存在,因此您绝对不能将其指定为该点

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

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

特定于PHP5.3.x 首先,不可能将lambda指定为默认属性值(lambda不被视为常量表达式)。因此,不可能直接进行该任务;您需要在构造函数中执行此操作

其次,在PHP5.3.x中,不能在lambda中使用
$this
。典型的解决方法是复制
$this
并捕获它,如:

$that = $this;
$func = function() use($that) { ... };
但是,通过这种方式,根本无法从lambda内部访问
$that
的非公开成员,因此该技术无法直接用于您的案例

您可能应该做的是将
$this->backend
存储在构造函数中的局部变量中,并在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); }
    );
 }
不能将lambda指定为默认属性值的限制仍然存在。

特定于PHP 5.3.x 首先,不可能将lambda指定为默认属性值(lambda不被视为常量表达式)。因此,不可能直接进行该任务;您需要在构造函数中执行此操作

其次,在PHP5.3.x中,不能在lambda中使用
$this
。典型的解决方法是复制
$this
并捕获它,如:

$that = $this;
$func = function() use($that) { ... };
但是,通过这种方式,根本无法从lambda内部访问
$that
的非公开成员,因此该技术无法直接用于您的案例

您可能应该做的是将
$this->backend
存储在构造函数中的局部变量中,并在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); }
    );
 }

不能将lambda指定为默认属性值的限制仍然存在。

不能直接从变量或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() ...

不能直接从变量或作为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() ...

正如我在原始问题中所说,删除“use($this->backend)”并不能修复错误。同时,删除fwrite()调用以便函数中从未提及$this也不会修复错误。谢谢你的帮助,但我现在更关心的是让lambda正常工作的直接问题。@Chris,哦,我误解了,对不起。没问题,就像我说的谢谢$this的观点一样,我已经重构了它的特定部分,删除了对$this的引用,但仍然希望去掉这个讨厌的部分“意外的T_函数”错误首先也是最重要的:)@Chris Hmmm,这可能意味着不可能在类蓝图中添加匿名函数作为属性。它看起来非常像。让我们等待专家的意见,但我不确定…您可以尝试在构造函数中分配它,我打赌这会直接起作用away@Pekka웃 lambda函数也是如此,不管怎样,它们在内部都是
Closure
类的实例。正如我在原始问题中所说,删除“use($this->backend)”并不能修复错误。同时删除fwrite()调用函数中从未提及的$this不会修复错误。谢谢您的帮助,但我更关心的是如何让lambda立即工作。@Chris,哦,我误解了,对不起。没问题,就像我说的,谢谢关于$this的观点,我已经重构了它的特定部分以删除引用$this,但仍希望摆脱讨厌的“意外T_函数”“首先也是最重要的错误:)@Chris Hmmm,这可能意味着不可能在类蓝图中添加匿名函数作为属性。看起来很像。让我们等待专家的意见,我不确定。。。你可以试着在构造函数中分配它,我打赌这会很好用的away@Pekka웃 lambda函数也是如此,不管怎样,它们在内部都是
Closure
cla的实例