Странности при сравнении типов в PHP

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

var_export('str'==0); // true
Code language: PHP (php)
$status = 0;
switch($status) {
    default:
        echo 1;
    break;
    case 'str':
        echo 2;
    break;
}
Code language: PHP (php)

Возвращает 2, потому что PHP считает, что 0 == ‘str’. Пояснение такой логики в табличке:

https://secure.php.net/manual/ru/types.comparisons.php

Нужно запомнить правило — если мы сравниваем что-то, что может быть как строкой, так и числовым значением, то нужно сначала всё приводить к строке.

$status = 0;
switch((string)$status) {
    default:
        echo 1;
    break;
    case 'str':
        echo 2;
    break;
}
Code language: PHP (php)

Здесь уже возвращает 1.