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

25

我想知道PHP是否有任何与JavaScript中的IIFE(立即调用函数表达式)等效的东西。 PHP闭包是否可以以任何方式编写,以便它可以类似于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 谢谢。


1
PHP代码在全局避免方面没有JS那么重视,这是由于许多原因造成的。 - dandavis
3
除了你的 IIFE 创建了一个全局变量之外,没有其他内容。 - Kevin B
你可以给你的代码命名空间,这样就不会污染全局命名空间。 - MinusFour
@dandavis 是的,每次编写 PHP 代码时,我都必须使用前缀 $t_my_var 表示临时变量,$g_my_var 表示全局变量,并使用 private 进行作用域限定,再通过 class MySuperClosure{ } 进行封装,以避免命名约定中的重复。 - Pristine Kallio
1
你有没有考虑重新设计,而不是试图将 JS 的破碎(是的,我知道)作用域解决方案强行引入到你的 PHP 项目中? - PeeHaa
显示剩余4条评论
2个回答

55

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

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

这在PHP 5.x中无法使用。相反,最接近的解决方法是:

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

哦,那会很不错,但我的云IDE供应商仍然提供PHP 5.5.9的服务。 - Pristine Kallio
3
它可以防止意外使用全局变量,因此通常是一个好主意 - 尽管PHP的正式命名空间机制可能会减少这种需要。 - Brett Zamir
1
另一个选项是将其定义为变量 - 如果您需要多次调用它,则这非常有用,例如 $func = function($param) { echo $param; }; $func('Hello'); - GuruBob

1

你也可以立即在PHP中调用匿名类。

<?php new class (0,1) {
  public function __construct (int $a, int $b) {

    (($a < 1) ? 'var_dump' : 'var_export')(
      gettype (($b > 0) ? __FUNCTION__ 
        : (($a > 0) ? microtime (true) 
        : __LINE__
    )))&exit;
    
  }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接