PHP中的IIFE(立即调用函数表达式)?

Posted

技术标签:

【中文标题】PHP中的IIFE(立即调用函数表达式)?【英文标题】:IIFE (Immediately Invoked Function Expression) in PHP? 【发布时间】:2016-05-04 19:45:13 【问题描述】:

我想知道 php 是否有类似 javascript 的 IIFE(立即调用函数表达式)的任何 等价性PHP Closure 是否可以写成类似于 Javascript(调用、依赖、注入、指令)的工作方式?

(function()
    myModule = angular.module('myAngularApplication', []);
());

上面的这个表达式被称为立即调用函数表达式(IIFE)。因为每当加载 .js 文件时,函数定义都会立即调用自身。 IIFE 有效的主要原因是我们可以立即执行所有代码,而无需使用全局变量和函数。现在当我们这样做时,我们的控制器创建将失败,因为我们使用全局变量来创建带有模块的控制器。为了规避这个问题,让我们使用 getter 函数 angular.module 将控制器与模块关联起来。当我们这样做的时候,为什么不把控制器也放在一个 IIFE 中呢。

(function () 

    var booksController = function ($scope) 
         $scope.message = "Hello from booksController";
    

    angular.module('myAngularApplication').controller('booksController', booksController); 
());

来源:http://www.codeproject.com/Articles/995498/Angular-Tutorial-Part-Understanding-Modules-and 谢谢。

【问题讨论】:

php 代码并没有像 JS 那样将全局避免放在相同的优先级上,原因有很多。 JS 中的匿名 IIFE 模式是为了提供一些私有变量的外观(因为 ES5 变量只是函数作用域)。该模式扩展为function foo() ...; foo();,可以用任何语言完成。 除了你的 IIFE 确实创建了一个全局变量。 O.o Creating and invoking an anonymous function in a single statement的可能重复 您是否考虑过重新考虑您的设计,而不是试图将 JS 的损坏(是的,我知道)范围界定解决方案纳入您的 php 项目? 【参考方案1】:

在 PHP 7 中,是的,您可以:

(function()  echo "yes, this works in PHP 7.\n"; )();

这在 PHP 5.x 中不起作用。相反,你能来的最接近的是:

call_user_func(function()  echo "this works too\n"; );

【讨论】:

哦,那太好了,但我在云端的 IDE 提供商仍然在 5.5.9 为 PHP 提供服务。 它可以防止意外使用全局变量,所以是的,这通常是个好主意——尽管 PHP 的正式命名空间机制可能会最大限度地减少这种需要。 另一个选项是将它定义为一个变量 - 如果您需要多次调用它,这很有用,例如$func = function($param) echo $param; ; $func('你好');

以上是关于PHP中的IIFE(立即调用函数表达式)?的主要内容,如果未能解决你的问题,请参考以下文章

立即调用函数(IIFE)

立即调用的函数表达式(IIFE)

javascript 理解立即调用的函数表达式(IIFE)

JS-立即执行函数表达式(IIFE)

JS-立即执行函数表达式(IIFE)

c_cpp C ++立即调用函数表达式(IIFE)