2015-10-15 3 views
0

some_function($input) возвращает целое число 23PHP, если заявления - логика

$other_int имеет значение, которое не равно 23

Фрагмент кода 1

if ($int = some_function($input) && $int != $other_int) {...} 

фрагмент кода 2

$int = some_function($input); 
if ($int != $other_int) {...} 

Я закодировал фрагмент 1 мышления что оператор if вернется с учетом приведенных выше условий. Я был неправ.

Утверждение if в фрагменте 2 истинно.

Почему?

+2

Вы не можете поместить назначение внутри предложения if –

+1

@ Дагон Да, вы можете. В этом весь вопрос. Почему этот код дает ожидаемый результат, когда присваивание находится за пределами предложения, а не внутри. –

ответ

3

Как уже упоминалось, && имеет более высокий приоритет, чем присвоение, поэтому вы выполняете логическую операцию до, которую вы назначаете переменной.

Вместо && вы можете использовать and. and и or имеют более низкий приоритет, чем назначение, и предназначены именно для таких ситуаций.

if ($int = some_function($input) and $int != $other_int) 
4

Таким образом, назначения в предложении if, как это, является плохой практикой по причине. Тем не менее, вы не назначаете то, что считаете себя. Это то, что вы на самом деле делаете:

$int = (some_function($input) && $int != $other_int); 

который оценивает true. Для того, чтобы получить результат, который вы хотите, изменить код

if (($int = some_function($input)) && ($int != $other_int)) {...} 

Но на самом деле, не назначайте переменные в случае() заявление.

0

Вы не можете присвоить значение, как, что внутри if заявления и сравнить это значение в том же заявлении

https://3v4l.org/FlE6u

<?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

+0

Хотя мне лично не нравится подход, вы __can__ присваиваете и сравниваете оператор 'if', OP просто не хватает скобок для порядка операций, нет ?. [Https://3v4l.org/IPDQK](https://3v4l.org/IPDQK) – camelCase

0

Интересно, что переменная не может быть инициализирована и использована в состоянии оператора 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 
} 
1

&& и != имеют более высокий приоритет, чем оператор присваивания =.

См http://www.php.net/manual/en/language.operators.precedence.php

Так внутри условно:

if ($int = some_function($input) && $int != $other_int) {...} 

Он выполняет != то &&, но $int еще не инициализирована (если вы еще не инициализирован его пределами, что условная) поэтому правая сторона != всегда возвращает false.

Смежные вопросы