PHP 中的闭包...确切地说,它们是什么,何时需要使用它们?

2022-08-30 07:56:54

所以我正在以一种很好的,最新的,面向对象的方式进行编程。我经常使用PHP实现的OOP的各个方面,但我想知道什么时候可能需要使用闭包。是否有任何专家可以阐明何时实现闭包是有用的?


答案 1

PHP 将在 5.3 中原生支持闭包。当您需要一个仅用于某些小的特定目的的本地函数时,闭包是很好的。闭包的 RFC 给出了一个很好的例子:

function replace_spaces ($text) {
    $replacement = function ($matches) {
        return str_replace ($matches[1], ' ', ' ').' ';
    };
    return preg_replace_callback ('/( +) /', $replacement, $text);
}

这允许您在 内部本地定义函数,这样它就不会:
1)弄乱全局命名空间
2)使人们三年后想知道为什么全局定义的函数仅在另一个函数中使用replacementreplace_spaces()

它使事情井井有条。请注意函数本身如何没有名称,它只是被定义并分配为对 的引用。$replacement

但请记住,您必须等待 PHP 5.3 :)


答案 2

当您将来需要一个功能来执行您现在决定的任务时。

例如,如果您读取了一个配置文件,并且其中一个参数告诉您 for 您的算法是 而不是 ,则可以创建一个闭包,该闭包将在您需要散列某些内容的任何地方使用。hash_methodmultiplysquare

闭包可以在 (例如) 中创建 ;它创建一个函数,使用变量 local to (从配置文件) 调用。无论何时调用,它都可以访问局部作用域中的变量,即使它未在该作用域中被调用。config_parser()do_hash_method()config_parser()do_hash_method()config_parser()

一个希望是好的假设例子:

function config_parser()
{
    // Do some code here
    // $hash_method is in config_parser() local scope
    $hash_method = 'multiply';

    if ($hashing_enabled)
    {
        function do_hash_method($var)
        {
            // $hash_method is from the parent's local scope
            if ($hash_method == 'multiply')
                return $var * $var;
            else
                return $var ^ $var;
        }
    }
}


function hashme($val)
{
    // do_hash_method still knows about $hash_method
    // even though it's not in the local scope anymore
    $val = do_hash_method($val)
}

推荐