Моя цель - поместить некоторую сложную логику в оператор 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».
Что плохого в том, как я это делаю? Кажется, что он говорит: «Да, это конечно функция!» вместо «Нет, потому что функция оценивается как ложная». Есть ли способ сделать то, что я пытаюсь сделать?