我的目标是在if()语句中放入一些复杂的逻辑。让我们说我有一系列值,如果我的数组中的所有内容都非零,我将执行一些代码。通常情况下,我可以说$valid = true
,foreach
我的数组,并在找到零时设置$valid = false
。然后我运行我的代码if ($valid)
。或者,我可以将循环放入函数中,并将函数放在我的if()
。
但是我很懒,所以我宁愿不去讨论一堆有效的"我不想写一个只在一个地方使用的全新功能。
所以,让我说我有这个:
if ($q = function() { return 'foo'; }) {
echo $q;
}
else {
echo 'false';
}
我期待if
获得'foo'
,其评估为真。我的闭包致力于$q
并且语句执行。 $q
返回字符串foo
和' foo'打印出来。
相反,我收到错误Object of class Closure could not be converted to string
。
所以让我们试试这个:
if (function() { return false; }) {
echo 'foo';
}
else {
echo 'true';
}
我原以为我的功能会返回false并且' true'会被打印出来。相反,' foo'打印出来。
我这样做的方式有什么问题?它似乎在说,"是的,这肯定是一个功能!"而不是"不,因为函数评估为false。"有没有办法做我想做的事情?
答案 0 :(得分:6)
function() { return false; }
创建一个类型为Closure
的对象,与其他类类型的new
类似,请比较以下代码:
$func = function() { return false; };
$func
现在是一个对象。每个对象在if
子句中返回true。所以
if ($func)
{
# true
} else {
# will never go here.
}
您可能希望这样做:
if ($func())
{
# true
} else {
# false
}
将调用Closure对象$func
并给它返回值。
答案 1 :(得分:3)
这两个评价为真。
您需要使函数执行以在if语句中使用它。
试试这个:
$q = function() { return false; };
if ($q()) { //should not go here.
echo $q();
}
else {
echo 'false';
}
答案 2 :(得分:2)
PHP的闭包是作为hack实现的 - Closure
类型的对象。您的代码实际上是实例化此类的对象,并将其分配给$ q。在PHP中,赋值的结果是赋值,因此实际上你的代码归结为
if (new Closure()) { ... }
答案 3 :(得分:1)
当你调用echo
时,你没有执行闭包,因此它试图打印出闭包,而不是闭包的结果:
echo $q();
答案 4 :(得分:0)
您正在创建匿名函数,但从不执行它。当您测试$q = function() { return 'foo'; }
时,您所说的是“将此匿名函数的引用分配给$ q,如果$ q不为null则传递此测试”(PHP不是很有趣吗?)
在测试和回显$q
之前,您需要调用闭包并将其结果分配给$q
。