some_function($input)
возвращает целое число 23
$other_int
имеет значение, которое не равно 23
Фрагмент кода 1
if ($int = some_function($input) && $int != $other_int) {...}
Фрагмент кода 2
$int = some_function($input);
if ($int != $other_int) {...}
Я кодировал фрагмент 1, думая, что выражение if вернет true, учитывая приведенные выше условия. Я был неправ.
Оператор if во фрагменте 2 является верным.
Зачем?
Как уже упоминали другие, &&
имеет более высокий приоритет, чем назначение, поэтому вы выполняете логическую операцию до Вы назначаете на переменную.
Вместо &&
ты можешь использовать and
, and
а также or
имеют более низкий приоритет, чем назначение, и предназначены именно для таких ситуаций, как это.
if ($int = some_function($input) and $int != $other_int)
Таким образом, назначения в предложении if, как это, являются плохой практикой по причине. Тем не менее, вы не назначаете то, что вы думаете. Это то, что вы на самом деле делаете:
$int = (some_function($input) && $int != $other_int);
который оценивается как истина. Чтобы получить желаемый результат, измените код на
if (($int = some_function($input)) && ($int != $other_int)) {...}
Но на самом деле, не назначайте переменные в операторе if ().
&&
и !=
имеют более высокий приоритет, чем оператор присваивания =
,
Увидеть http://www.php.net/manual/en/language.operators.precedence.php
Итак, внутри условно:
if ($int = some_function($input) && $int != $other_int) {...}
Выполняет !=
тогда &&
, но $int
еще не инициализирован (при условии, что вы не инициализировали его за пределами этого условия), поэтому правая сторона !=
всегда возвращает ложь.
Вы не можете присвоить такое значение внутри if
утверждение И сравнить это значение в том же утверждении
<?php
function somefunc() {
return 23;
}
if($int = somefunc() && $int == 23) {
echo 'Equal';
} else {
echo 'Not Equal';
}
echo "\n";
var_dump($int);
Вы заметите ошибку
Примечание: неопределенная переменная: int in / in / GHVKs в строке 7
И в конце $int
является false
, Назначьте это за пределами вашего if
Интересно, что переменная не может быть инициализирована и использована в условии if
заявление. Возможно, вы нашли ошибку / функцию php.
function some_function()
{
return 23;
}
$intA = 0;
if ($intA = some_function()
&& $intA != $other_int
) {
echo 'hello world!'; // works fine
}
if ($intB = some_function()
&& $intB != $other_int
) {
echo 'hello world!'; // PHP Notice: Undefined variable: intB
}