Странное поведение PHP с регистром переключателей и строкой «-0»

Недавно я столкнулся с очень странным поведением в случае переключения PHP при работе со строкой '-0'.

/* 
The code below echos:
'How did that happen? "0" and "0" are two different strings.' 
*/

$myString = '-0';

switch($myString) {
    case '0':
       echo 'How did that happen? "-0" and "0" are two different strings.';
       break;
    case '-0':
       echo 'This is normal.';
       break;
}

Как ни странно, приведенный выше оператор switch выполняет case '0'.

Возвращаясь к приведенному выше коду, кажется, что если вы измените порядок случаев и поместите случай '-0' перед случаем '0', он будет работать нормально и выполнять случай '-0', как и должно быть. < br>
Почему так? Есть ли причина такого странного поведения?


person Mystical    schedule 05.12.2018    source источник
comment
Это потому, что в php вы не объявляете типы переменных, а затем -0 и 0 численно одно и то же.   -  person Sakura Kinomoto    schedule 05.12.2018


Ответы (1)


При написании этого вопроса я обнаружил, что PHP НЕ использует строгое равенство для проверки случаев переключения (в отличие от других языков сценариев, таких как JavaScript).

Следовательно, case '0' выполняется, если '0' == '-0', и, поскольку это верно, вместо этого выполняется это (потому что он сначала проверил этот случай).

Если case '-0' был помещен первым, он сначала проверяет его, поэтому выполняет этот случай, и, поскольку оба случая допустимы / TRUE, выполняется первый случай в операторе switch.

person Mystical    schedule 05.12.2018