如何在PHP中实现作用域函数?

时间:2010-02-07 08:47:53

标签: php function scope

function parent($key)
{
     function son()
     {
         global $key;
     }
}

我想实现这个目标:

  1. son可以访问$key
  2. parent

    由于这是一个非常简单的功能,我不想将parent更改为类

    好的,我被告知function无论如何都是全球性的。那么son是否有办法获得$key的{​​{1}}呢?

6 个答案:

答案 0 :(得分:1)

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

有关详细信息,请参阅PHP manual

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

既然你提到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);

答案 4 :(得分:0)

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

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

关于我们 - 你在寻找这样的东西吗?

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

答案 5 :(得分:0)

根据我的理解,您需要一个为您生成自定义排序功能的函数,具体取决于传递的参数,

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)