Php 是否可以设置仅在函数中全局的变量?
也就是说,匿名函数可见的变量是主函数。我这样问是因为array_walk_recursive只允许一个额外的参数,如果能够从匿名函数中访问一些变量而不依赖常量compact和extract,那就太好了。Closure可以:Php 是否可以设置仅在函数中全局的变量?,php,Php,也就是说,匿名函数可见的变量是主函数。我这样问是因为array_walk_recursive只允许一个额外的参数,如果能够从匿名函数中访问一些变量而不依赖常量compact和extract,那就太好了。Closure可以: function() use ($var) { /*code*/} 使用Use(vars)关闭函数中的这些变量 无法发布到官方使用文档的链接,因为php.net缺少该文档如果要将多个参数传递到array\u walk\u recursive,请将它们作为数组传递: arra
function() use ($var) { /*code*/}
使用Use(vars)
关闭函数中的这些变量
无法发布到官方使用文档的链接,因为php.net缺少该文档如果要将多个参数传递到
array\u walk\u recursive
,请将它们作为数组传递:
array_walk_recursive($data, 'callbackFn', array('arg1', new Foo, $bar));
在回调内部,您可以通过数组索引访问每个附加参数
示例()
通过
\uuu invoke
将对象用作函数可能是闭包的有用替代方法:
<?php
class Walker
{
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function __invoke($val, $key)
{
if ($val == $this->a || $val == $this->b)
echo "$key\n";
}
}
$a = array('the', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog');
array_walk($a, new Walker('quick', 'dog'));
是的,这些链接完全没有很好的解释这里是维基上的rfc链接。这是一个很好的解释。当然,我不会去寻找它。我也不知道这是否是OPA的一个好答案当你使用use
时,它不是Lambda,而是一个闭包,从技术上讲,你不是在访问外部范围变量,而是在定义闭包时关闭这些变量。看见但从实用的角度来看,它可能会产生预期的结果。我发现这是helpful@Headspin但是应该注意的是,IBM文章并没有反映闭包的当前实现。所以你不应该把那篇文章中的一切都当作事实。不过,这仍然是一个可以接受的概述。在数组中,这是什么意思,我很困惑。@user它创建了一个Foo实例。这只是一个例子,说明了基本上可以为该函数添加任何附加参数。您不限于一个参数。\uu invoke
仅适用于PHP5.3+,在这种情况下,您应该真正使用closures@user102008,用于“只读”闭包。。。是的,对象是不必要的。通常情况就是这样,但有时实现\u invoke
的对象是有用的。我同意结束是解决这个问题的正确工具;我只是指出了另一种选择。
<?php
class Walker
{
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function __invoke($val, $key)
{
if ($val == $this->a || $val == $this->b)
echo "$key\n";
}
}
$a = array('the', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog');
array_walk($a, new Walker('quick', 'dog'));