Есть два различия между ==
и ===
в массивах 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()
в тестах выше.