代码之家  ›  专栏  ›  技术社区  ›  Blackbam

在PHP中,匿名函数和静态匿名函数之间到底有什么区别?

  •  0
  • Blackbam  · 技术社区  · 4 年前

    基本上是为了 the static keyword 我完全清楚,PHP文档只在类的上下文中解释关键字的用途。我注意到我的一个IDE插件建议我将许多回调函数声明为静态函数。

    没有静电:

    $myUniqueArray = unique($arrayToFilter,
        function (ExamQuestion $examQuestion) {
            return $examQuestion->getId();
        }
    );
    

    对于静态:

    $myUniqueArray = unique($arrayToFilter,
        static function (ExamQuestion $examQuestion) {
            return $examQuestion->getId();
        }
    );
    

    对于结果来说,这并没有什么不同,它同时起作用。在PHP中,回调函数和静态回调函数到底有什么区别?在这种情况下,可能的优点和缺点是什么?

    1 回复  |  直到 4 年前
        1
  •  4
  •   hakre    4 年前

    你指的是 Static Anonymous Functions [DOC] 在文件中介绍如下:

    匿名函数可以静态声明。这样可以防止当前类自动绑定到它们。对象在运行时也可能不会绑定到它们。

    如果你把它和 static 类上下文中的关键字 方法 [ DOC ] ,这可能会使关系更加清晰。这些在文档中介绍如下:

    由于静态方法可以在不创建对象实例的情况下调用,因此伪变量 $this 在声明为静态的方法中不可用。

    所以真正的区别是你没有 这美元 在匿名函数中绑定/可用 静止的 .

    在IDE中得到建议的原因是,静态匿名函数比非静态变量的性能稍好一些。所以除非你需要 这美元 在该功能中,您可以安全地使用 静止的 相对于非静态变量。


    PHP5.3中引入了匿名函数,包括 静止的 关键词 [RFC] [5.3.0] .在PHP5.3中 这美元 在类中定义时没有自动绑定(有意),并且在PHP5.4中进行了更改,从那时起就是这样 这美元 自动为(非静态)匿名函数绑定。

    从PHP7.4开始,你可以找到 arrow functions [DOC]

    箭头函数支持与匿名函数相同的功能,只是使用父作用域中的变量总是自动的。

    不仅仅是 这美元 如果一个(非静态)箭头函数被绑定,那么(即使是静态的)父范围中的所有变量都会被自动使用。因此,这更有可能影响性能,而不是偶尔带来的好处 静止的 用于匿名函数。


    由于您没有共享哪个IDE,所以这只是猜测您所指的具体建议。我们有根据的猜测是关于 EA inspections plugin :

    [EA]这个闭包可以声明为静态的(更好的范围;在某些情况下可以提高性能)。

    可以使用静态闭包 EA检查。进一步的信息:

    分析闭包并建议使用静态闭包。

    这可以带来额外的性能改进,例如 here :

    此外,通过使用静态函数(){}闭包,在处理私有属性时,我们又挤出了15%的水合性能。

    (来自Phpstorm中Php检查(EA Ultimate)提供的检查描述)

        2
  •  1
  •   Michael Käfer    4 年前

    被接受的答案是 hakre 这本书内容丰富,但我认为有一点是错误的。

    静态箭头函数和静态匿名函数的性能相同:

    这是:

    $x = 123;
    static function () { return true; }
    

    表现如下:

    $x = 123;
    static fn() => true;
    

    公认的答案假设箭头功能较慢,因为 $x 始终由箭头函数中的值捕获。这不是真的,因为如果 x美元 如果没有使用(如我的示例中所示),那么它就不会被值捕获。我只是用PHP的 get_defined_vars() .

    推荐文章