【问题标题】:IIFE (Immediately Invoked Function Expression) in PHP?PHP中的IIFE(立即调用函数表达式)?
【发布时间】: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
  • 您是否考虑过重新考虑您的设计,而不是试图将 JS 的损坏(是的,我知道)范围界定解决方案纳入您的 php 项目?

标签: javascript php angularjs


【解决方案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('你好');
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2012-09-02
  • 2023-04-04
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多