Моя цель - добавить сложную логику в оператор 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'.
Вместо этого я получаю сообщение об ошибке Объект класса Closure не может быть преобразован в строку
.
Так что давайте попробуем вместо этого:
if (function() { return false; }) {
echo 'foo';
}
else {
echo 'true';
}
Я ожидал, что моя функция вернет false и будет напечатано «true». Вместо этого печатается «foo».
Что плохого в том, как я это делаю? Похоже, он говорит: «Ага, это точно функция!» вместо «Нет, потому что функция вернула ложь». Есть ли способ сделать то, что я пытаюсь сделать?