显然$ pid超出了范围。它不应该与功能“关闭”吗?我很确定这就是闭包在javascript中的工作原理。
根据一些文章php closures are broken,我无法访问此?
那么如何从这个闭包函数中访问 $ pid ?
class MyClass {
static function getHdvdsCol($pid) {
$col = new PointColumn();
$col->key = $pid;
$col->parser = function($row) {
print $pid; // Undefined variable: pid
};
return $col;
}
}
$func = MyClass::getHdvdsCol(45);
call_user_func($func, $row);
编辑我使用了$col->parser = function($row) use($pid)
来解决这个问题。不过我觉得这很难看。
答案 0 :(得分:25)
您需要指定以这种方式关闭哪些变量:
function($row) use ($pid) { ... }
答案 1 :(得分:0)
您可以使用bindTo方法。
class MyClass {
static function getHdvdsCol($pid) {
$col = new PointColumn();
$col->key = $pid;
$parser = function($row) {
print $this->key;
};
$col->parser = $parser->bindTo($parser, $parser);
return $col;
}
}
$func = MyClass::getHdvdsCol(45);
call_user_func($func, $row);
答案 2 :(得分:-4)
我认为PHP在变量范围方面非常一致。规则是,如果在函数外定义变量,则必须明确指定它。对于词法范围,使用'use',使用全局变量'global'。
例如,您不能直接使用全局变量:
$n = 5;
function f()
{
echo $n; // Undefined variable
}
您必须使用全局关键字:
$n = 5;
function f()
{
global $n;
echo $n;
}