PHP封闭范围问题

时间:2011-07-01 03:51:45

标签: php scope closures

显然$ 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)来解决这个问题。不过我觉得这很难看。

3 个答案:

答案 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;
}