是否可以在PHP中将匿名函数作为参数传递?如果可以,怎么办?
我正在尝试将匿名函数传递给setter,该setter将使用该函数返回的值填充数组。
class MyClass
{
private $arr = array();
public function __construct()
{
$this->setArrElm('New', function(){return 123;});
}
private function setArrElm($name, $val)
{
// here: gettype($val) == object
$this->arr[$name] = $val;
}
}
请注意注释-val的类型是object,我希望是int。
答案 0 :(得分:0)
在PHP 7中,您可以自行执行闭包
<div class="row">
<div class="col-md-4 col-sm-4 text-center animate-box">
<div
class="work-grid"
id="logosera"
style="background-image: url(images/logo-biocentru.png);"
>
<img id="logosera" src="images/logo-biocentru.png" style="display:none" />
<div class="desc">
<h3><a href="#">Carti vizita</a></h3>
<span class="cat">Graphic Design</span>
<p>
<span class="download">
<a href="#logosera" download="biocentru.png">
<i class="icon-download"></i>
</a>
</span>
<span class="love">
<a href="#"><i class="icon-heart"></i></a>
</span>
</p>
</div>
</div>
</div>
</div>
输出
class MyClass
{
private $arr = array();
public function __construct()
{
$this->setArrElm('New', (function(){return 123;})()); //<-- self execute
}
private function setArrElm($name, int $val) //<-- added typehint
{
// here: gettype($val) == object
$this->arr[$name] = $val;
print_r($val);
}
}
new MyClass;
这采用类似于JS(可能也是其他语言)的形式:
123
重要的是要知道它正在执行函数,然后传递结果。您可以传递闭包(它是一个对象),然后执行它。但是,如果您有严格的类型并且需要一个int,则也可以自行执行闭包。
只有在需要int作为参数的情况下,这样做才有意义。即使在这种情况下,您也可以事先执行它,然后传递结果。这只会为您节省一个局部变量。
对于< PHP7 或仅仅是因为
Alt1
(function(){return 123;})()
Alt2
class MyClass
{
private $arr = array();
public function __construct()
{
$var = function(){return 123;};
$this->setArrElm('New', $var()); //<-- execute
}
private function setArrElm($name, $val) //<-- added typehint
{
// here: gettype($val) == object
$this->arr[$name] = $val;
print_r($val);
}
}
new MyClass;
Alt3
class MyClass
{
private $arr = array();
public function __construct()
{
$var = function(){return 123;};
$this->setArrElm('New', $var);
}
private function setArrElm($name, $val) //<-- mixed
{
if(gettype($val) == 'object' && is_a($val, '\Closure')){
//is a closure, you could use is_callable etc. too. see __invoke()
$val = $val();
}
$this->arr[$name] = $val;
print_r($val);
}
}
new MyClass;
欢呼