PHP 中的闭包或 create_function [英] Closures or create_function in PHP

查看:33
本文介绍了PHP 中的闭包或 create_function的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我决定在回调中使用闭包而不是 create_function,因此只支持 PHP > 5.3 主要是因为增加了可调试性,也因为我假设(他们说的是什么?假设?)在我的情况下,create_function 即时编译的开销可能会抵消任何额外的比较以及必须在函数中进行的比较.

I had made a decision to use closures for my callbacks instead of create_function and as such only support PHP > 5.3 mostly due to the increased debugability and also because I assumed (what is it they say about assumption?) that the overhead of the on-the-fly compilation of the create_function in my situation would probably offset any extra comparisons and such that had to be made within in the function.

情况很可能仍然如此(对于我的应用程序)并且需要进一步测试,但我对这个(非常)简单测试的输出感兴趣,它表明 create_function 方法更多当它只能删除四个条件(和连接)时,它比闭包快两倍.显然,在我的测试用例中没有进行额外的处理,这是获得或丢失大部分速度的地方,但是在您几乎没有额外处理但有很多条件(可以删除)和回调被调用了足够多的次数,我开始认为使用 create_function 可能更好.

This may well still be the case (for my application) and further testing is required, but I was interested in the output of this (very) simple test, that shows the create_function method being more than twice as fast as the closure when it can remove just four conditionals (and concats). Obviously there is no extra processing going on in my test case, and that is where most of the speed will be gained or lost, but in the case where you have little extra processing but a lot of conditionals (that could be removed) and the callback is called enough times I started to think that it may be better to use create_function.

然而,create_functioneval 之间有明显的相似性,我对此持谨慎态度.

However with the obvious similarity between create_function and eval, I'm wary of it.

那么主要的问题是用 create_function 创建的匿名函数和闭包创建的匿名函数有什么区别?

So the main question is what are the differences between anonymous functions created with create_function and those of closures?

我在想的几个具体问题是,当 eval 功能被禁用时,create_function 还能工作吗?而且,我确定我最近在某处读到 create_function 函数即使声明为内部函数也会污染全局(或类)命名空间,但闭包不会.我现在找不到对此的引用,但这些陈述中的一个或两个都是真的吗?

A few specific questions I'm thinking of are, will create_function even work when eval functionality is disabled? And, I'm sure I read somewhere recently that create_function functions will pollute the global (or class) namespace even if declared as inner functions, but closures won't. I can't find the reference to this now, but are either or both of those statements true?

这是我运行的小测试:

<?php

function foo($a=true, $b=true, $c=true, $d=true)
{
    $inner1 = create_function(
        '', 
        '$r = \''.($a ? 'a' : '').
                  ($b ? 'b' : '').
                  ($c ? 'c' : '').
                  ($d ? 'd' : '').'\';
         return $r;'
    );  


    $inner2 = function() use ($a, $b, $c, $d) 
    {   
        $r = ''; 
        if($a) { $r .= 'a'; }
        if($b) { $r .= 'b'; }
        if($c) { $r .= 'c'; }
        if($d) { $r .= 'd'; };
        return $r; 
    };  


    $time = microtime(true);
    for ($x=0; $x<99999; ++$x)
    {   
        $i1out = $inner1();
    }   
    echo '1:'.(microtime(true)-$time).'<br>';

    $time = microtime(true);
    for ($x=0; $x<99999; ++$x)
    {   
        $i2out = $inner2();
    }   
    echo '2:'.(microtime(true)-$time).'<br>';

    echo var_dump($i1out===$i2out).'<br>';
}

foo();

推荐答案

构造 function() {..} 是一个匿名函数,这个特性经常和 闭包.create_function 和匿名函数都不会污染全局命名空间.

The construct function() {..} is an anonymous function, and this feature is often implemented together with closures. Neither create_function nor anonymous functions pollute the global namespace.

由于匿名函数可以访问周围的变量(闭包部分),理论上它们可以稍微慢一点.另一方面,如果您使用字节码缓存(如果不使用,您显然不关心性能),我希望匿名函数的编译"开销会稍微慢一些.

Since anonymous functions can access surrounding variables (the closure part), they can, in theory, be slightly slower. On the other hand, if you're using bytecode caching (and if you're not, you are obviously not concerned about performance), I'd expect the "compilation" overhead of anonymous functions to be slightly slower.

然而,匿名函数和 create_function 之间的差异极不可能是性能问题的根源.因此,如果您有幸拥有 php>5.3 的目标平台,我会选择更具可读性的匿名函数形式.

However, it is extremely unlikely that the difference between anonymous functions and create_function is a source of performance problems. Therefore, I'd choose the more readable form of an anonymous function if you are so fortunate to have a target platform with php>5.3.

这篇关于PHP 中的闭包或 create_function的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆