以下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); }
)
);
}
答案 0 :(得分:4)
首先,不能将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 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() ...