2011-07-01 101 views
10

显然$ pid超出了范围。该功能不应该“关闭”吗?我相当确定这是JavaScript中的闭包工作方式。PHP关闭范围问题

根据一些文章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)。不过我觉得这很丑陋。

+4

这不是丑,是封闭在PHP中是如何工作的 – zerkms

+0

这就是它如何在PHP中如此.. – tradyblix

+0

这是一种丑陋的语言,但我坚持下去。 :( – Keyo

回答

25

你需要指定哪些变量应该以这种方式被关闭:

function($row) use ($pid) { ... } 
+0

如果这个闭包保存在一个变量中,然后传递给其他$ pid不存在的范围,将pid以某种方式封装在闭包中,或者不可访问? –

+0

@Josh Nankin:实际上'use($ var,...)'是如何在php中实现闭包的,因此如果将匿名函数传递给另一个变量作用域 - '$ pid'变量将包含最后一个定义的值 – zerkms

+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); 
-4

我觉得PHP在变量的范围上非常一致。规则是,如果变量在函数之外定义,则必须明确指定它。对于词汇范围,使用'使用',因为使用全局'全局'。

例如,你不能也直接使用全局变量:

$n = 5; 

function f() 
{ 
    echo $n; // Undefined variable 
} 

您必须使用global关键字:

$n = 5; 

function f() 
{ 
    global $n; 
    echo $n; 
}