Чем отличаются операторы сравнения PHP (== double equals) и тождества (=== triple equals)?

В чем разница между == а также ===?

  • Как именно работает слабо == Сравнительная работа?
  • Как именно строгий === Сравнительная работа?

Какие были бы полезные примеры?

451

Решение

Разница между слабо == оператор равенства и строгий === идентичный оператор точно объясняется в руководство:

Операторы сравнения

┌──────────┬───────────┬────────────────────────── ─────────────────────────────────┐
│ Пример │ Имя │ Результат │
├──────────┼───────────┼────────────────────────── ─────────────────────────────────┤
A $ a == $ b │ Равен │ ИСТИНА, если $ a равно жонглированию типов. │
A $ a === $ b │ Одинаково │ ИСТИНА, если $ a равно $ b и они одного типа. │
└──────────┴───────────┴────────────────────────── ─────────────────────────────────┘

Если вы используете == оператор или любой другой оператор сравнения, который использует свободное сравнение, такое как !=, <> или же ==, вы всегда должны смотреть на контекст чтобы увидеть, что, где и почему что-то преобразуется, чтобы понять, что происходит.

Правила конвертации

Таблица сравнения типов

В качестве ссылки и примера вы можете увидеть таблицу сравнения в руководство:

Слабые сравнения с ==

┌─────────┬───────┬───────┬───────┬───────┬─────── ┬───────┬───────┬───────┬───────┬─────────┬─────── ┬───────┐
│ │ ИСТИНА │ ЛОЖЬ │ 1 │ 0 │ -1 │ «1» │ «0» │ «-1» │ NULL │ array () │ "php" │ "" │
├─────────┼───────┼───────┼───────┼───────┼─────── ┼───────┼───────┼───────┼───────┼─────────┼─────── ┼───────┤
│ ИСТИНА │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │
│ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │
│ 1 │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ SE ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ 0 │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ИСТИНА │
│ -1 │ ИСТИНА, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ИСТИНА, ЛОЖЬ, ЛОЖЬ, ИСТИНА, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ.
│ «1» │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ «0» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
-1 «-1» │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ NULL │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ TRUE │ TRUE
│ array () │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ FALSE │ FALSE │
Ph «php» │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ "" │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │
└─────────┴───────┴───────┴───────┴───────┴─────── ┴───────┴───────┴───────┴───────┴─────────┴─────── ┴───────┘

Если вы используете === оператор или любой другой оператор сравнения, который использует строгое сравнение, такое как !== или же ===, то вы всегда можете быть уверены, что типы не волшебно изменить, потому что не будет никакого преобразования. Таким образом, при строгом сравнении тип и значение должны совпадать, а не только значение.

Таблица сравнения типов

В качестве ссылки и примера вы можете увидеть таблицу сравнения в руководство:

Строгое сравнение с ===

┌─────────┬───────┬───────┬───────┬───────┬─────── ┬───────┬───────┬───────┬───────┬─────────┬─────── ┬───────┐
│ │ ИСТИНА │ ЛОЖЬ │ 1 │ 0 │ -1 │ «1» │ «0» │ «-1» │ NULL │ array () │ "php" │ "" │
├─────────┼───────┼───────┼───────┼───────┼─────── ┼───────┼───────┼───────┼───────┼─────────┼─────── ┼───────┤
│ ИСТИНА, ИСТИНА, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ.
│ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ 1 │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ 0 │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ -1 │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ «1» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ «0» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
-1 «-1» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ НУЛЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │
│ array () │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE UE FALSE │
Ph «php» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ
│ "" │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │
└─────────┴───────┴───────┴───────┴───────┴─────── ┴───────┴───────┴───────┴───────┴─────────┴─────── ┴───────┘
582

Другие решения

Оператор == осуществляет приведение между двумя разными типами, если они различаются, а оператор === выполняет «безопасное сравнение типов». Это означает, что он вернет true, только если оба операнда имеют одинаковый тип и одно и то же значение.

Примеры:

1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value

Предупреждение: два экземпляра одного класса с эквивалентными членами НЕ соответствуют === оператор. Пример:

$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)
233

Одна картинка стоит тысячи слов:

PHP Двойные Равные == диаграмма равенства:

введите описание изображения здесь

PHP Тройные Равные === Диаграмма равенства:

введите описание изображения здесь

Исходный код для создания этих изображений:

https://github.com/sentientmachine/php_equality_charts

Медитация Гуру

Те, кто хочет сохранить свое здравомыслие, читать дальше не будут.

  1. ‘==’ преобразует левый и правый операнды в числа, когда это возможно (123 == «123foo», но «123»! = «123foo»
  2. Шестнадцатеричная строка в кавычках иногда является плавающей точкой и будет приведена к ней против вашей воли.
  3. == не является транзитивным, потому что («0» == до 0, а 0 = == «», но «0»! = «»)
  4. «6» == «6», «4.2» == «4.20» и «133» == «0133». Но 133! = 0133, потому что 0133 восьмеричное. Но «0x10» == «16» и «1e3» == «1000»
  5. Переменные PHP, которые еще не были объявлены, являются ложными.

  6. False равно 0, пустой строке и пустому массиву и «0».

  7. Когда числа достаточно велики, они == Бесконечность.
  8. NAN не == сам, но это правда.

  9. Новый класс == к 1.

  10. Ложь является наиболее опасным значением, потому что Ложь == для большинства других переменных, в основном, в ущерб ее цели.

Надежда:

Если вы используете PHP, вы не должны использовать оператор двойного равенства, всегда используйте тройное равенство.

57

Что касается JavaScript:

Оператор === работает так же, как оператор ==, но требует, чтобы его операнды имели не только одинаковое значение, но и одинаковый тип данных.

Например, в приведенном ниже примере будет отображаться «x и y равны», но не «x и y идентичны».

var x = 4;
var y = '4';
if (x == y) {
alert('x and y are equal');
}
if (x === y) {
alert('x and y are identical');
}
38

Дополнение к другим ответам относительно сравнения объектов:

== сравнивает объекты, используя имя объекта и его значения. Если два объекта одного типа и имеют одинаковые значения элементов, $a == $b дает истину.

=== сравнивает внутренний идентификатор объекта из объектов. Даже если члены равны, $a !== $b если они не совсем один и тот же объект.

class TestClassA {
public $a;
}

class TestClassB {
public $a;
}

$a1 = new TestClassA();
$a2 = new TestClassA();
$b = new TestClassB();

$a1->a = 10;
$a2->a = 10;
$b->a = 10;

$a1 == $a1;
$a1 == $a2;  // Same members
$a1 != $b;   // Different classes

$a1 === $a1;
$a1 !== $a2; // Not the same object
22

Проще говоря:

== проверяет, если эквивалент (только значение)

=== проверяет, так же (значение && тип)

Эквивалент против того же: аналогия

1 + 1 = 2 + 0 (Эквивалент)

1 + 1 = 1 + 1 (так же)

В PHP:

правда == 1 (истина — эквивалент по значению)

правда === 1 (ложь — не одно и то же по значению && тип)

  • правда это логический
  • 1 является ИНТ
13

Это все о типах данных. Возьмите BOOL (true или false), например:

true также равно 1 а также
false также равно 0

== не заботится о типах данных при сравнении:
Так что, если у вас есть переменная, которая равна 1 (который также может быть true):

$var=1;

А потом сравнить с ==:

if ($var == true)
{
echo"var is true";
}

Но $var на самом деле не равно true, Является ли? Имеет значение int 1 вместо этого, что, в свою очередь, равно истинному.

С ===типы данных проверяются, чтобы убедиться, что две переменные / объекты / что угодно используют один и тот же тип.

Так что если бы я сделал

if ($var === true)
{
echo "var is true";
}

это условие не будет выполнено, так как $var !== true это только == true (если вы понимаете, о чем я).

Зачем вам это нужно?

Просто — давайте посмотрим на одну из функций PHP: array_search():

array_search() Функция просто ищет значение в массиве и возвращает ключ элемента, в котором было найдено значение. Если значение не может быть найдено в массиве, возвращается ложный. Но что, если вы сделали array_search() на значении, которое было сохранено в первый элемент массива (который будет иметь ключ массива 0) …. array_search() функция вернет 0 … что равно false ..

Так что, если вы сделали:

$arr = array("name");
if (array_search("name", $arr) == false)
{
// This would return 0 (the key of the element the val was found
// in), but because we're using ==, we'll think the function
// actually returned false...when it didn't.
}

Итак, вы видите, как это может быть проблемой сейчас?

Большинство людей не используют == false при проверке, возвращает ли функция ложь. Вместо этого они используют !, Но на самом деле это точно так же, как использование ==falseтак что если вы сделали:

$arr = array("name");
if (!array_search("name", $arr)) // This is the same as doing (array_search("name", $arr) == false)

Так что для таких вещей, вы бы использовали === вместо этого, чтобы проверить тип данных.

8

Одним из примеров является то, что атрибут базы данных может быть нулевым или «»:

$attributeFromArray = "";
if ($attributeFromArray ==  ""){}  //true
if ($attributeFromArray === ""){}  //true
if ($attributeFromArray ==  null){}  //true
if ($attributeFromArray === null){}  //false

$attributeFromArray = null;
if ($attributeFromArray ==  ""){}  //true
if ($attributeFromArray === ""){}  //false
if ($attributeFromArray ==  null){}  //true
if ($attributeFromArray === null){}  //true
8
По вопросам рекламы [email protected]