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(立即调用函数表达式)?的主要内容,如果未能解决你的问题,请参考以下文章