在我的老师的一次锻炼中,他写下了下一个宣言:
$ gen =(function(){
产量1;
产量2;
返回3;
})();
他在谈论“收益”,但我真的不理解第二个括号的功能(在最后一个分号之前)。
答案 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
基本上,PHP知道匿名函数调用应创建一个闭包对象,然后在使用(function ... )
括号进行调用时,它将调用__invoke
魔术方法,该方法是闭包的功能。然后以同样的方式做$f('hello')
(function ...)('hello')
做同样的事情。
现在,我不知道这到底是不是发生在幕后,但是从功能上讲,这就是它的工作方式。
希望如此。
最后一件事是其中一些仅在较新版本的PHP中有效,我将不得不查询每个排列以确切地了解何时PHP实现它们。但是它们都可以在PHP7 +中工作,我认为在PHP5.3中添加了闭包,但是直到PHP5.4(不能在其中使用$this
)之前,作用域才是错误的。我认为5.6添加了(new Object)
语法,但是我对此可能是错误的。而且我很确定PHP7中添加了隐式调用(Obj)()
。
我亲自做过很多工作的主要版本是4.4
,5.0
5.3
,5.6
和7+