Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以设置仅在函数中全局的变量?_Php - Fatal编程技术网

Php 是否可以设置仅在函数中全局的变量?

Php 是否可以设置仅在函数中全局的变量?,php,Php,也就是说,匿名函数可见的变量是主函数。我这样问是因为array_walk_recursive只允许一个额外的参数,如果能够从匿名函数中访问一些变量而不依赖常量compact和extract,那就太好了。Closure可以: function() use ($var) { /*code*/} 使用Use(vars)关闭函数中的这些变量 无法发布到官方使用文档的链接,因为php.net缺少该文档如果要将多个参数传递到array\u walk\u recursive,请将它们作为数组传递: arra

也就是说,匿名函数可见的变量是主函数。我这样问是因为array_walk_recursive只允许一个额外的参数,如果能够从匿名函数中访问一些变量而不依赖常量compact和extract,那就太好了。Closure可以:

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'));