Лучше всего почитать объяснение в официальной документации.
Оператор равенства == сравнивает две переменные с приведением типов, если это необходимо. Если 2 операнда имеют разный тип, они приводятся к одному, и затем сравниваются.
Оператор идентичности === проверяет, являются ли переменные равные и при этом имеют одинаковый тип. То есть, грубо говоря, если у операндов будет разный тип, то === сразу же вернёт false, не будет даже смотреть на их значения.
Я составил таблицу, которая наглядно демонстрирует, как 2 переменные соотносятся друг с другом.
‘===’ означает, что они считаются идентичными.
‘==’ означает, что они считаются равными.
‘!=’ означает, что они не считаются равными.
false | null | array() | 0 | "0" | 0x0 | "0x0" | "000" | "0000" | |
---|---|---|---|---|---|---|---|---|---|
false | === | == | == | == | == | == | != | != | != |
null | == | === | == | == | != | == | != | != | != |
array() | == | == | === | != | != | != | != | != | != |
0 | == | == | != | === | == | === | == | == | == |
"0" | == | != | != | == | === | == | == | == | == |
0x0 | == | == | != | === | == | === | == | == | == |
"0x0" | != | != | != | == | == | == | === | == | == |
"000" | != | != | != | == | == | == | == | === | == |
"0000" | != | != | != | == | == | == | == | == | === |