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