如何访问封闭函数的变量?

时间:2011-04-21 09:38:54

标签: php

我在其他函数中使用了一个回调函数,我需要从这个封闭函数中访问一个变量,但不知道该怎么做。这是一个例子:

function outer($flag)
{
    $values = array(1, 5, 3, 9);

    usort($values, function($a, $b)
    {
        if ($flag)
        {
            // Sort values in some way
        }
        else
        {
            // Sort values in some other way
        }
    });
}

所以我将一些标志传递给外部函数,然后在排序回调函数中使用它来决定如何对值进行排序。是的,我知道我可以检查外部函数中的标志,然后调用不同的排序函数,但这不是问题。

问题是如何在回调中访问外部函数的变量(或参数)。而不是使用全局变量。如果真的没办法,“这是不可能的”答案也是可以接受的。

3 个答案:

答案 0 :(得分:5)

use个关键字。它使函数的当前值可用。

function outer($flag)
{
  $values = array(1, 5, 3, 9);

  usort($values, function($a, $b) use ($flag)
  {
    if ($flag)
    {
        // Sort values in some way
    }
    else
    {
        // Sort values in some other way
    }
   });
}

答案 1 :(得分:3)

两个三种方式:

  1. 使用global,这不是您的选择
  2. 根据$flag
  3. 调用不同的回调
  4. 请参阅chiborg's answer了解如何使用php的新lambda函数/内联回调正确执行此操作 - 下面提到的性能开销仍然适用
  5. 我会选择选项2.因为,还会有性能提升:当进行10000次比较时,您的旗帜将被检查10000次。当使用两个单独的回调函数时,标志只会被检查一次(比较可能是排序算法中最常用的操作)。

答案 2 :(得分:0)

如果没有明确传递变量,这是不可能的。

你必须将$ flat传递给函数(),如函数($ a,$ b,$ flag)。