PHP <5.3的实时闭包

3

有没有办法在 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

我该如何使用内部函数定义函数的模式,并使内部函数可以访问外部函数变量?
2个回答

5
下面的代码在这个简单的情况下可以工作:
function make_adder($x) {
    return create_function('$to', 'return '.var_export($x, true).' + $to;');
}
$add5 = make_adder(5);
$add5(100); # => 105

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

那里巧妙地使用了 var_export! :-D - gen_Eric
好的,这个可以运行...但是它违背了闭包的整个目的:简洁和可读的代码(想象一下为几十行函数做这样的事情...):( - NeuronQ
3
你要求在PHP < 5.3中寻找解决方案。除了 create_function()之外,没有匿名函数的相应功能。 - Stefan Gehrig
虽然它可以在脚本中使用,自动将5.3向下兼容到5.2代码。 - NeuronQ
@NeuronQ:虽然有一些闭包的用途无法通过这种方法实现,因此脚本需要能够判断。 - newacct

0
简单回答:在 PHP 版本低于 5.3 的情况下,你所要求的是无法实现的。很抱歉,这个功能根本不可用。除了使用全局变量之外,甚至没有任何有用的解决方法。
然而,如果你正在使用早于 5.3 版本的 PHP,我强烈建议你升级。
两年前,5.2 被宣布终止生命周期,并且自那时以来就没有得到任何支持或安全修复 - 它是不受支持和不安全的。
此外,缺乏支持也延伸到操作系统。对于大多数服务器操作系统,当前操作系统版本中不存在 5.2 及更早版本的安装程序。这意味着,如果你正在运行 PHP 5.2,那么你很可能也在运行过时的操作系统版本。这也具有安全隐患。
没有一位值得他的薪水的系统管理员会允许他的网络在公共可访问系统上运行已知不安全的软件,因此,如果你还没有升级,你真的需要立即这样做。
如果你正在使用一个没有升级的 Web 托管公司,你应该考虑将你的业务转移到一个关心他们网络安全的公司。

问题从来没有提到需要在任何地方或其他东西上托管它。它只是关于编程语言的一个问题。 - newacct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接