Что замыкания PHP возвращают в операторах IF?

Моя цель - добавить сложную логику в оператор 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».

Что плохого в том, как я это делаю? Похоже, он говорит: «Ага, это точно функция!» вместо «Нет, потому что функция вернула ложь». Есть ли способ сделать то, что я пытаюсь сделать?

8
задан hakre 24 November 2012 в 20:08
поделиться