【问题标题】:Real closure in PHP <5.3PHP <5.3 中的真正闭包
【发布时间】:2012-12-23 16:55:06
【问题描述】:

有没有办法在 PHP 中为早于 5.3 的语言版本编写真正的闭包(因为 5.3 为匿名函数添加了 use 关键字)?

我 PHP 5.3+ 我可以写:

function make_adder($x) {
    return function($to) use ($x) {
        return $to + $x;
    };
}
$add5 = make_adder(5);
$add5(100); # => 105

如何使用这种在函数内部定义函数的模式,而内部函数可以访问外部函数变量?

【问题讨论】:

    标签: php functional-programming closures


    【解决方案1】:

    在这种简单的情况下,以下内容将起作用:

    function make_adder($x) {
        return create_function('$to', 'return '.var_export($x, true).' + $to;');
    }
    $add5 = make_adder(5);
    $add5(100); # => 105
    

    但这并不是严格意义上的闭包。

    【讨论】:

    • 巧妙地使用var_export 那里! :-D
    • 好吧,这行得通……但它违背了闭包的全部目的:干净且可读的代码(想象一下为几个 10 行函数执行此操作……):(
    • 您要求 PHP create_function(),没有其他等效的匿名函数。
    • ...虽然它可以在脚本中用于自动将 5.3 代码反向移植到 5.2 代码
    • @NeuronQ:虽然有一些闭包的使用不能通过这种方法完成,所以脚本需要能够分辨出来。
    【解决方案2】:

    简单的答案:您所要求的无法在低于 5.3 的 PHP 版本中完成。抱歉,该功能根本不可用。甚至没有任何有用的解决方法(当然,除了使用全局变量)。

    但是,如果您使用的 PHP 版本早于 5.3,我会强烈建议您升级。

    5.2 在两年前被宣布终止使用,从那时起支持或安全修复为零——它不受支持且不安全。

    此外,缺乏支持也延伸到操作系统。对于大多数服务器操作系统,当前操作系统版本不存在 5.2 及更早版本的安装程序。这意味着如果您正在运行 PHP 5.2,那么您很可能也在运行过时的操作系统版本。这也有安全隐患。

    任何值得他付出的系统管理员都不会允许他的网络在可公开访问的系统上运行已知不安全的软件,因此,如果您还没有升级,那么您现在真的需要这样做。

    如果您正在使用尚未升级的网络托管公司,您应该考虑将您的业务转移到关心其网络安全的公司。

    【讨论】:

    • 这个问题从来没有说过需要在任何地方或任何地方托管它。这只是关于语言的问题。
    猜你喜欢
    • 2011-12-25
    • 2011-08-16
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多