Что означают! == и === в PHP?


person xRobot    schedule 02.11.2010    source источник
comment
Очень жаль, что поисковая система SO не работает для '===', потому что этот вопрос задают примерно раз в месяц.   -  person Paul Tomblin    schedule 02.11.2010
comment
Один из лучших ответов представлен в виде комментария xD   -  person Álvaro González    schedule 02.11.2010
comment
@Paul Есть это для === и this для !==. Это своего рода дубликат обоих; Я голосую за закрытие как дубликат первого, и, надеюсь, кто-то другой проголосует за второго, чтобы они оба появились в списке (тот, кто проголосовал за закрытие как NaRQ, просто ленив)   -  person Michael Mrozek    schedule 02.11.2010
comment
@Paul Tomblin: Вы должны приходить сюда довольно редко;)   -  person BoltClock    schedule 02.11.2010
comment
Вот еще один: Что означает «===»?   -  person Felix Kling    schedule 02.11.2010
comment
@Bolt, может я виноват в недооценке. Я не очень активен в теге php.   -  person Paul Tomblin    schedule 02.11.2010
comment
@ Пол: * проверяет ваши теги * Вы правы.   -  person BoltClock    schedule 02.11.2010


Ответы (6)


Это операторы строгого сравнения типов. Они проверяют не только значение, но и тип.

Рассмотрим ситуацию, когда вы сравниваете числа или строки:

if (4 === 4) // same value and type
{
  // true
}

но

if (4 == "4") // same value and different type but == used
{
  // true
}

и

if (4 === "4") // same value but different type
{
  // false
}

Это относится как к объектам, так и к массивам.

Поэтому в приведенных выше случаях вы должны сделать разумный выбор, использовать ли == или ===

Хорошая идея использовать ===, когда вы также уверены в типе

Дополнительная информация:

person Sarfraz    schedule 02.11.2010

Это операторы эквивалентности идентичности.

1 == 1
1 == "1"
1 === 1
1 !== "1"
true === true
true !== "true"
true == "true"

Все это приравнивается к истине. Также проверьте эту ссылку, предоставленную @mbeckish

person Gabi Purcaru    schedule 02.11.2010
comment
Я бы не стал называть это идентичностью, потому что два объекта с разными идентификаторами могут иметь одинаковое значение и один и тот же тип (и быть === равными как таковые). В php просто нет идентичности. - person poke; 02.11.2010
comment
Это оператор эквивалентности. Он утверждает, что оба аргумента (левая и правая стороны) равны и имеют один и тот же тип (а если объект, то один и тот же класс). - person ircmaxell; 02.11.2010

=== также проверяет тип переменной.

Например, "1" == 1 возвращает истину, а "1" === 1 возвращает ложь. Это особенно полезно для функций, которые могут возвращать 0 или False (например, strpos).

Это не сработает правильно, потому что strpos возвращает 0 и 0 == false

if (strpos('hello', 'hello world!'))

Однако это сработает:

if (strpos('hello', 'hello world!') !== false)
person Vincent Savard    schedule 02.11.2010
comment
Это правильный ответ, но я добавлю пример. strpos("abcde", "f") возвращает false, потому что f не входит в строку abcde. Вы можете проверить это и использовать if (strpos("abcde", "f")===false). Если вы просто выполнили if(!(strpos("abcde", "f"))), у вас будут проблемы, если strpos действительно вернет 0. Почему? Поскольку PHP типизирован слабо, а 00 и false эквивалентны, когда типы не сравниваются. - person Brad; 02.11.2010

Знак двойной = представляет собой сравнение и проверяет, имеет ли переменная / выражение / константа слева то же значение, что и переменная / выражение / константа справа.

Знак тройной = - это сравнение, чтобы увидеть, равны ли две переменные / выражения / константы И имеют ли они один и тот же тип, т.е. обе являются строками или обе являются целыми числами.

То же самое относится и к! ==

person Martin    schedule 02.11.2010

Они вернут истину только в том случае, если и тип, и значение заданных значений эквивалентны. Пример: 1 === 1 верно "1" === 1 неверно 1 === "1" неверно "1" === "1" верно

где, как и в случае с ==, все вышеперечисленное было бы правдой

person Community    schedule 02.11.2010

Когда вы используете два знака равенства ==, он проверяет одно и то же значение.

if( '1' == 1 ) { echo 'yes'; }

Приведенный выше код работает, потому что они имеют одинаковое значение.

Но если вы используете три знака равенства ===, он проверит значение и тип данных.

Следовательно

if( '1' === 1 ) { /* this will not work */ }

Это потому, что '1' имеет тип данных string, а 1 - это integer или number

Но можно было бы сделать что-то вроде этого - думаю: D

if( (integer) '1' === 1 ) { echo 'this works'; }

Поскольку мы меняем тип данных '1' на integer

person Baylor Rae'    schedule 02.11.2010