PHP双括号中的变量声明?

时间:2018-09-09 01:10:12

标签: php

在我的老师的一次锻炼中,他写下了下一个宣言:

  $ gen =(function(){
        产量1;
        产量2;
        返回3;
})();
 

他在谈论“收益”,但我真的不理解第二个括号的功能(在最后一个分号之前)。

1 个答案:

答案 0 :(得分:0)

像JavaScript一样,它允许您使用自变量作为示例

$gen = (function($a){
   echo "this is $a";
})('a');

输出

 this is a

自己测试Sandbox

在Javascript中,我使用类似的内容

 (function($){

 })(jQuery);

当jQuery处于兼容模式时。它做同样的事情,将jQuery放入$中。同样的交易。

更新

我可以用另一种方式解释这些,你可以做到

$a = new Object($b);
$b->doSomething();

完全可以理解的权利,那么这个呢?

    //call a method of an object without setting a local variable
   (new Object($b))->doSomething();

使用闭包,它会__invoke作为方法(基本上),或者,如果您尝试将对象作为方法/函数执行,它就会知道调用它。

    (function($a){echo "this is $a";})('a');

这也很容易显示。

class foo{ 
    public function __invoke($e){
        echo $e;
    } 
}

(new foo)("hello");
//these are all equivalent to the above, and work.

$foo = new foo;
//call invoke directly   
$foo->__invoke("hello");
//remember Foo is an instance of Foo. so this calls __invoke magic method
//call invoke indirectly
$foo("hello");

//then in the same way this (new object) works and the above works then
(new foo)->__invoke("hello");
//this also works
(new foo)("hello");

输出

hello

Sandbox

基本上,PHP知道匿名函数调用应创建一个闭包对象,然后在使用(function ... )括号进行调用时,它将调用__invoke魔术方法,该方法是闭包的功能。然后以同样的方式做$f('hello') (function ...)('hello')做同样的事情。

现在,我不知道这到底是不是发生在幕后,但是从功能上讲,这就是它的工作方式。

希望如此。

最后一件事是其中一些仅在较新版本的PHP中有效,我将不得不查询每个排列以确切地了解何时PHP实现它们。但是它们都可以在PHP7 +中工作,我认为在PHP5.3中添加了闭包,但是直到PHP5.4(不能在其中使用$this)之前,作用域才是错误的。我认为5.6添加了(new Object)语法,但是我对此可能是错误的。而且我很确定PHP7中添加了隐式调用(Obj)()

我亲自做过很多工作的主要版本是4.45.0 5.35.67+