Чем отличаются операторы сравнения PHP (== double equals) и тождества (=== triple equals)? - PullRequest
468 голосов
/ 17 сентября 2008

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

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

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

Ответы [ 21 ]

0 голосов
/ 12 сентября 2018

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

Два массива с различными типами ключей

Если у вас есть массив с сортировкой ключей и другой массив с другой сортировкой ключей, они строго различаются (т. Е. Используются ===). Это может произойти, если вы отсортируете массив по ключам и попытаетесь сравнить отсортированный массив с исходным.

Например, рассмотрим пустой массив. Сначала мы пытаемся добавить некоторые новые индексы в массив без какой-либо специальной сортировки. Хорошим примером будет массив со строками в качестве ключей. Теперь углубимся в пример:

// Define an array
$arr = [];

// Adding unsorted keys
$arr["I"] = "we";
$arr["you"] = "you";
$arr["he"] = "they";

Теперь у нас есть массив несортированных ключей (например, «он» пришел после «вы»). Рассмотрим тот же массив, но мы отсортировали его ключи по алфавиту:

// Declare array
$alphabetArr = [];

// Adding alphabetical-sorted keys
$alphabetArr["I"] = "we";
$alphabetArr["he"] = "they";
$alphabetArr["you"] = "you";

Совет : Вы можете отсортировать массив по ключу, используя функцию ksort () .

Теперь у вас есть другой массив с сортировкой ключей, отличной от первой. Итак, мы собираемся сравнить их:

$arr == $alphabetArr; // true
$arr === $alphabetArr; // false

Примечание : Это может быть очевидно, но сравнение двух различных массивов с использованием строгого сравнения всегда приводит к false. Тем не менее, два произвольных массива могут быть равны, используя === или нет.

Вы скажете: «Эта разница незначительна». Тогда я говорю, что это различие и должно быть рассмотрено и может произойти в любое время Как уже упоминалось выше, сортировка ключей в массиве является хорошим примером этого.

Предметы

Имейте в виду, два разных объекта никогда не бывают строго равными . Эти примеры помогут:

$stdClass1 = new stdClass();
$stdClass2 = new stdClass();
$clonedStdClass1 = clone $stdClass1;

// Comparing
$stdClass1 == $stdClass2; // true
$stdClass1 === $stdClass2; // false
$stdClass1 == $clonedStdClass1; // true
$stdClass1 === $clonedStdClass1; // false

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

Примечание : Начиная с PHP7 добавлено анонимных классов . Из результатов нет никакой разницы между new class {} и new stdClass() в тестах выше.

...