【问题标题】:How to implement scoped function in PHP?如何在 PHP 中实现作用域函数?
【发布时间】:2010-02-07 08:47:52
【问题描述】:
function parent($key)
{
     function son()
     {
         global $key;
     }
}

我想实现这个:

  1. son 可以访问$keyparent

因为它是一个相当简单的函数,我不想把parent变成一个类

好的,有人告诉我function 无论如何都是全球性的。那么son 有没有办法获得$key$key 呢?

【问题讨论】:

  • 你不能把$key 作为参数传递给son() 吗?
  • 我不能,因为它是由usort这样调用的:usort($arr,'son');
  • 你能详细说明你到底需要什么吗?发布更多代码。我不明白usort 是如何阻止传递该参数的。
  • 你可以看看这个问题的最新版本。

标签: php function scope


【解决方案1】:

PHP 中的所有函数都有global scope - 即使它们被定义在内部,它们也可以在函数外部调用,反之亦然。

更多详情请参考PHP manual

【讨论】:

    【解决方案2】:

    从 PHP 5.3 开始,您可以这样做:

    function parent($key) {
        $son = function() use (&$key) {
            var_dump($key);
        };
        $son();
    }
    parent('foo');
    

    关于 usort -- 您是否正在寻找类似的东西?

    $key = 'foo';
    $arr = array(
        array(0, 'foo' => 1),
        array(1, 'foo' => 4),
        array(2, 'foo' => -2),
    );
    
    usort($arr, function ($a, $b) use (&$key) {
        $a = $a[$key];
        $b = $b[$key];
        if ($a == $b) return 0;
        return ($a < $b) ? -1 : 1;
    });
    
    var_dump($arr);
    

    【讨论】:

    • 但我需要$key 以及由usort 填充的那些
    【解决方案3】:

    您可以在 OOP 中执行此操作,但不能在另一个函数中创建一个函数。但是,一种方式可能是这样的:

    // make sure that parent function exists
    if (function_exists('parent'))
    {
       // ok fine, now create the son function
       function son()
       {
           global $key;
       }
    }
    

    【讨论】:

    • 但我不想将$key 定义为global,它根本没有其他地方使用过
    【解决方案4】:

    您为什么不考虑 OOP 方法?使用使用不同修饰符的方法定义类:public/private...当然我很简化,但是朝着这个方向发展将有助于实现您的目标。

    如果您坚持不使用 OOP,但仍然需要这样做,请阅读:http://www.steike.com/code/php-closures/http://wiki.php.net/rfc/closures。由于闭包,这是我知道在没有 OOP 而是使用函数式编程的情况下如何做到这一点的唯一方法。

    【讨论】:

    • 不,太简单了。另外,现在的项目不是OO的。OOP很好,但没必要。
    【解决方案5】:

    既然你提到usort(),这能行吗?

    $arr = array('foo', 'bar', 'tork', 'zug');
    
    usort($arr, 'mysort');
    
    function mysort($a, $b) {
        $a = do_something_with_a($a);
        $b = do_something_with_b($b);
    
        return strcmp($a, $b);
    }
    
    function do_something_with_a($val) {
        return strrev($val);
    }
    function do_something_with_b($val) {
        return strrev($val);
    }
    
    print_r($arr);
    

    【讨论】:

    • 我的目的只是将必要的参数传递给您的示例中的mysort
    • 那么恐怕您将不得不使用全局变量,除非您想将需要传递的值添加到数组的每个项目中并在比较函数中将其剥离。
    【解决方案6】:

    据我了解,您需要一个根据传递的参数为您生成自定义排序函数的函数,类似于

    function sorter($param) {
        return function($a, $b) use($param) {
            if($param == 'asc') return $a - $b;
            if($param = 'desc') return $b - $a;
        };
    }
    
    $a = array(1, 6, 2, 5, 3, 4);
    usort($a, sorter('asc'));
    print_r($a);
    usort($a, sorter('desc'));
    print_r($a);
    

    (仅限 PHP 5.3)

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 2023-03-11
      • 2019-06-17
      • 2013-03-28
      相关资源
      最近更新 更多