2015-06-23 1 views
7

При попытке познакомиться с оператором в PHP это произошло. Впервые я попробовал этот код ниже.Оператор if не работает для false в php

if(true) {echo 'true';} else {echo 'false';} 

И выход был true, когда условие true. Опять же, когда условие false (if(false)) это echos false.

Но я пробовал то же самое, используя переменную как условие, изменяя значение переменной.

$con='false'; 
if($con){echo 'true';} else{echo 'false';} 

В этой ситуации выход true даже тогда, когда значение переменной false или true. В то же время if statement работает нормально, когда 1 и 0 используются вместо true и false. Почему это происходит?

+4

'ложь' = ложный – Prasanth

+2

так .. много .. ответов: O – Luke

ответ

6

PHP делает некоторые подлые вещи в выражении if.Следующие значения считаются FALSE:

  • само логическое значение FALSE
  • целое число 0 (ноль)
  • поплавок 0,0 (ноль)
  • пустая строка, а строка "0"
  • массив с нулевыми элементами
  • объект с нулевыми переменными-членами (PHP 4 только)
  • специальный тип NULL (включая неустановленные переменные)
  • Объекты SimpleXML, созданные из пустых тегов

Каждое другое значение считается ИСТИННЫМ (включая любой ресурс).

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

+3

Что там скрытно? –

+0

Я фанат сильной печати :) – Luke

+0

спасибо. приятно объяснил! – DScript

9
$con='false'; 

Это 'false' является действительной строкой, которая не является булевой FALSE, так же, как $con='hi'; нет.

$con=FALSE; //this is false now 

Цитата из Manual

Чтобы указать логическое значение литерала, используйте константы ИСТИНА или ЛОЖЬ. Оба нечувствительны к регистру.

чтения Также эти другие варианты, которые у вас есть

При преобразовании в булево, следующие значения считаются FALSE:

◦ булево FALSE сам
◦ целое число 0 (ноль)
◦ поплавок 0.0 (ноль)
◦ пустая строка и строка «0»
◦ массив с нулевыми элементами
◦ объект с нулевыми переменными-членами (PHP 4 только)
◦ специального типа NULL (включая неустановленные переменные)
◦ объектов SimpleXML, созданные из пустых тегов

Тогда вы наблюдали это

В то же время оператор if работает нормально, когда 1 и 0 используются вместо true и false. Почему это происходит?

Это потому, что 0 в любой форме является ЛОЖНЫМ, либо строковым, либо числовым. Но текст false как строка не является ложным по причинам, упомянутым выше.

Также читайте о PHP Strict Comparisons, так как вы учитесь, потому что

var_dump(0==FALSE); //bool(true) 
var_dump(0===FALSE); //bool(false) :) 
2

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

$con=false; 
2

'false' не такой же, как false.

if('true') или if('false') приведет true всегда, как они будут рассматриваться как string с и будут преобразованы для сравнения.

$con=false; 
if($con){echo 'true';} else{echo 'false';} 

Напечатает false

2

В вашем втором примере $con не булево false, это строковый литерал'false' (обратите внимание на кавычки), и любая непустая строка в PHP вычисляется как true.

Чтобы исправить это, просто падение котировок:

$con=false; // no quotes! 
if($con){echo 'true';} else{echo 'false';} 
3

Используйте логическое значение вместо строки:

$con = false; 

Ваш если заявление будет просто проверить, что $ CON не пусто, так что в ваш пример всегда будет правдой.

+0

"Начиная с PHP 5.3"? Ничего не изменилось в отношении логического сравнения в такой недавней истории. – deceze

+0

@deceze Я думал, что PHP, проверяющий, была ли пустая строка такой, как это было введено на PHP 5.3, я возьму ее, чтобы все равно путать. –

3

Как описано в разделе о выражениях, выражение оценивается по его логическому значению. Если выражение оценивается как TRUE, PHP выполнит оператор, и если он будет оценивать FALSE, он проигнорирует его. Более подробную информацию о значениях, которые можно оценить для FALSE, можно найти в разделе 'Converting to boolean'.

Так, согласно документации попытаться использовать

$con = false;//boolean and not a string 
if($con){echo 'true';} else{echo 'false';} 

При преобразовании в булево, следующие значения считаются FALSE:

◦ в логическое значение FALSE самого
◦ целое число 0 (ноль)
◦ поплавок 0.0 (ноль)
◦ пустая строка и строка «0»
◦ массив с нулевыми элементами
◦ объект с нулевыми переменными-членами (PHP 4 только)
◦ специального типа NULL (включая неустановленные переменные)
◦ объектов SimpleXML, созданных из пустых тегов

Check Docs (IF MANUAL)

2

Ваше объявление $ con - это строка не bool. Поэтому он всегда будет возвращать истину. Объявить логическое значение, используйте:

$con=FALSE; //or TRUE 
3

Вы используете «лжи», как STRING переменные а, но это СЛОВО лжи, не БУЛЕВЫХ константы. Просто используйте ложные

if(true) {echo 'true';} else {echo 'false';} 

$con='false'; // Wrong 
$con=false; // Right 
if($con){echo 'true';} else{echo 'false';} 

И когда вы делаете, если заявления, это будет работать:

if ($con == false) { echo 'false'; } 

или вы можете использовать === который сравнивает одно выражение на другое по значению и по типу ,

if ($con === false) { echo 'false with type safe comparison!'; } 
1

изменить значение переменной в этом

$con = false;  
Смежные вопросы