Оценка и назначение в заявлении if

0

Мне интересно, будет ли это работать с любыми крупными версиями PHP?

if ($foo != $bar && '' != $str = some_function($some_variable))
    echo $str;

some_function($some_variable) возвращает строку, которая назначается переменной $str а затем проверяется, является ли пустая строка. Переменная $str используется, конечно, позже.

Будет ли выход some_function назначенной переменной $str в каждой основной версии PHP (> 5)? Я не мог найти никакой информации об этом. Благодарю.

В настоящее время я работаю 5.4, и он работает.

Изменить: Чтобы избежать дальнейшей путаницы, $foo != $bar предшествует другому выражению, потому что переменная $str используется только внутри оператора if. Извините, я забыл прояснить это.

Теги:

3 ответа

2
Лучший ответ

Я бы не понял, почему это не сработает ни в одной версии PHP (> 5). Протестировано здесь: http://sandbox.onlinephpfunctions.com/code/a295189c50c191bbd0241d4e8ea4e3081cdb40ae

Работал со всеми версиями от 4.4.9 и выше.

Примечание. Поскольку вы используете оператор &&, код после && не будет запущен, если $ foo! = $ Bar уже возвращает false, поскольку второе выражение не может изменить результат оператора &&, поэтому оно просто игнорирует его.

Если задание имеет намерение всегда иметь место, измените порядок выражений.

if ('' != $str = some_function($some_variable) && $foo != $bar)
    echo $str;
  • 0
    Для вашего примера возьмите foo и bar 2, и он НЕ будет работать!
  • 0
    В вопросе не указывалось, было ли это намерением или нет, однако хорошо отметить, что назначение не будет выполнено в случае, если foo не равно bar, отредактирует мой ответ.
Показать ещё 7 комментариев
4

Да, это действительно работает, но чтобы заставить его работать так, как вы хотите, вы должны поставить скобки вокруг назначения, потому что сравнение имеет более высокий приоритет, чем назначение! (приоритет оператора)

Кроме того, если $foo != $bar является ложным, $str никогда не будет инициализироваться, поэтому также измените порядок, чтобы он получал все время.

Поэтому используйте это:

if ('' !== ($str = some_function($some_variable)) && $foo != $bar)
     //^^^ ^ See here                   And here^
     //| '!==' to also check the type
  • 0
    Мы хотим !== для этих сравнений строк только в случае жонглирования типов?
  • 1
    @sjagr обновил его! (Но OP не говорит, являются ли $bar и $foo также строками, поэтому я не обновил их там)
Показать ещё 1 комментарий
1

Почему бы вам не сделать это ясным и не путать, используя скобки и фигурные скобки. Пример:

if (($foo != $bar) && '' != ($str = some_function($some_variable)) ) {
       echo $str;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню