2013-04-17 3 views
3
$isClient = 0; 
if($isClient == 0) echo "is client 0\n"; 
if($isClient == "n") echo "is client n\n"; 
if($isClient == "y") echo "is client y\n"; 

Учитывая выше код, он выдает следующееY, N и 0 все равны 0?

is client 0 
is client n 
is client y 

Я должен что-то отсутствует здесь! Почему 0 приравнивается к «n» и «y» ???

A link to the above code for testing

+2

При использовании 0 без какого-либо контекста, предполагается, что это означает ложь - - если вы добавьте кавычки вокруг 0, он будет сравнивать строку со значениями.Это яблоки для яблок. – Drew

+0

Вот почему вы должны использовать '===', когда это возможно – kero

+2

[таблицы сравнения PHP] (http://php.net/manual/en/types.comparisons.php). – ajp15243

ответ

6

Здесь вы выполняете рыхлое сравнение (NB: строгое сравнение выполняются с помощью три знаков равенства: ===) и в этом случае строки оценивающей к нулю, потому что == является левый ассоциативный, что означает, что если первый операнд является целым числом, второй операнд также выводится на целые числа (таким образом, "n" интерпретируется как 0). Так работает PHP.

+0

Следует добавить, что строка оценивается в 0 только тогда, когда символ FIRST в строке не является числовым и при преобразовании непосредственно в INT. Строка будет по-прежнему вычисляться как boolean true при преобразовании в boolean. – JRL

+0

@JRL Отзыв от =) – silkfire

+0

Да. Если строка была «1 N», то строка будет передана в INT 1. Иногда это немного сложно. – JRL

4

Поскольку $isClient и "n" имеют разные типы данных, их необходимо преобразовать в общий тип данных для сравнения.

(int)"y" и (int)"n" оцениваются как 0, поэтому ваше равенство имеет место. Если вы хотите провести строгое сравнение, используйте знак тройного равенства. Он проверяет типы данных, а также:

<?php 

$isClient = 0; 
if($isClient === 0) echo "is client 0\n"; 
if($isClient === "n") echo "is client n\n"; 
if($isClient === "y") echo "is client y\n"; 

?> 

Это генерирует правильный вывод:

is client 0 
3

В PHP, когда вы хотите сравнить значения, вам нужно использовать три знака равенства (===), потому что:

Как описано в разделе о выражениях [см. Ниже], выражение оценивается по его логическому значению. Если выражение оценивается как TRUE, PHP выполнит оператор, и если он будет оценивать FALSE, он проигнорирует его. Более подробную информацию о значениях, которые можно оценить для FALSE, можно найти в разделе «Преобразование в логический». (Source)

и

Одна последняя вещь, которую стоит упомянуть, это значение истинности выражений. Во многих случаях, главным образом в условном исполнении и циклах, вас не интересует конкретная ценность выражения, но заботится только о том, означает ли это TRUE или FALSE. Константы TRUE и FALSE (без учета регистра) являются двумя возможными булевыми значениями. При необходимости выражение автоматически преобразуется в boolean. Подробнее о том, как это сделать, см. В разделе о литье типов.(Source)

Так что ваш код должен быть изменен следующим образом:

$isClient = 0; 
if($isClient === 0) echo "is client 0\n"; 
if($isClient === "n") echo "is client n\n"; 
if($isClient === "y") echo "is client y\n"; 

Выходы

is client 0 
Смежные вопросы