2014-04-09 1 views
-1

Может быть, если я не знаю, чего-л, но это работает:Can`t установить значение столбца 0 (ноль) в разделе IF в PHP

$city = City::find(1); 
$city->visible = 0; 

Это не:

if ($city->visible = 0) { 
} 

Это работы

if ($city->visible = ***) { 
} 
// where *** - number, except 0/letter 

Почему? Он возвращает false?

My bad: думал, что он присвоит значение переменной в объекте.

+3

Поскольку нуль равен false –

+0

Значение присваивания присваивается назначению. Итак, первая 'if' оценивает' if (0) '. Вероятно, вы ошибочно не использовали оператор '=='. – fracz

+0

Но я назначаю его нулю, не сравниваю. Каков наилучший способ сделать такую ​​проверку? (для всех чисел, кроме 0, он работает безупречно) – mozg

ответ

2

Это выражение

$city->visible = 0 

Что имеет значение 0. Таким образом, вы, по сути писать

if (0) { ... } 

Но 0 это значение falsey в PHP, так что IF блок никогда не будет называется


Сравните это

$city->visible = 1 

который оценивает в

if (1) { ... } 

1 является truthy значение в PHP, поэтому блок IF будет называться


За свой комментарий, пожалуйста, см

$a = 1;  // this silently evaluates to 1; no visible output 
echo $a = 0; // 0 
echo $a;  // 0 
+0

Спасибо, я по ошибке ошибся, что при назначении нулю - он сохраняет 0 в переменной в объекте – mozg

+0

@mozg, он сохраняет 0 до $ city-> visible. Но присваивание также имеет значение «return». Дополнительную ясность см. В моем редактировании. – naomik

0

если ($ Город-> видно == 0) {}

Обратите внимание на == для сравнения:

1

Основные правила PHP: возвращаемое значение операции присваивания - это назначенное значение.

Так что, когда вы делаете

if ($foo = 0) { 
} 

PHP присвоит 0 к $foo, а затем вернуться 0 к испытанию, если(). Поскольку 0 является ложным значением, проверка if() завершается с ошибкой, и любой код внутри него не выполняется.

Это тот же самый механизм, который позволяет

$foo = $bar = $baz = 42; 

работать. Назначения оцениваются/выполняются справа -> слева, и каждая из переменных заканчивается значением 42.

1

Это:

if ($city->visible = 0) {} 

эквивалентно:

$city->visible = 0; 
if($city->visible) {} 

что эквивалентно:

if(0) {} 

, который, конечно, эквивалентно:

if (false) { 
    // code that will never, under any circumstances, run. ever. 
} 
Смежные вопросы