2017-01-12 2 views
5

Может кто-то пожалуйста, объясните, почему дело «а» никогда не достигается в ниже код и почему он всегда будет исполнять дело 0Пожалуйста, объясните, почему PHP переключатель случай всегда выполняет случай 0 в этом коде

switch ("a") { 
case 0: 
    echo "0"; 
    break; 
case "a": // never reached because "a" is already matched with 0 
    echo "a"; 
    break; 
} 
+0

выключатель не может быть использован на строки и числа в то же время [читать далее] (http://php.net/manual/en/control-structures.switch.php#82351) – happymacarts

+0

Только предположение, но тот факт, что некоторые из значений коммутатора являются int и некоторые из них могут вызывать проблемы. – John3136

ответ

3

PHP, как JavaScript или Perl, является слабо типизированным языком и будет пытаться угадать, что вы хотите сделать. В этом случае он изменил вашу строку на ближайшее целое число, которое он мог найти, что равно нулю. Другими словами, "a" == 0 - это истинное утверждение в PHP.

Подробнее об этой теме можно найти в PHP . Я предлагаю вам ввести значение в операторе switch или заменить его на конструкцию if/elseif/else.

+1

Я связал неправильный пример ... https://3v4l.org/tC3pt. Это не так предсказуемо из того, что я могу сказать. –

+0

Интересно, кажется, что иногда это значение в 'select', которое жонглируется, а иногда это значение в' case'. – miken32

+0

Да, это очень странно. Попробуйте сделать значение '$ x =" 0 ";' ... Я вижу, как это будет ложно, но в то же время это буквальное значение «0» и по-прежнему поддерживает «ложь» над реальным случаем. Я думаю, что это может быть связано с заказом в некотором роде, но я не могу быть уверен. –

2

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

В условиях непрофессионала он попытается найти значение «a», которое не определено процессором, и, следовательно, в этом случае 0.

же будут идти на код ниже:

<?php 

$x = "a"; 
switch($x) 
{ 
    case "c": 
     echo "c"; 
    break; 

    case 1: 
     echo "1"; 
    break; 

    case 0: 
     echo "0"; 
    break; 

    case "a": 
     echo "a"; 
    break; 

    case false: 
     echo "false"; 
    break; 

    default: 
     echo "def"; 
    break; 
} 

?> 

Documentation is available at PHP.net

1

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

<?php 
    switch ("a") { 
     case "0": 
      echo "0"; 
      break; 
     case "a": // never reached because "a" is already matched with 0 
      echo "a"; 
      break; 
    } 

Для целого типа:

<?php 
switch (1) { 
    case 0: 
    echo 0; 
    break; 
    case 1: // never reached because "a" is already matched with 0 
    echo 1; 
    break; 
} 
1

Причина этого заключается в том, потому что switch использует loose comparison==

Это сказал:

if ("a" == 0) // TRUE 
if ("a" == true) // TRUE 

Практически все остальное будет оценивать ложь. (кроме "a" == "a")

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

//$var = "a"; 
$var = 0; 

$var = strval($var); 
switch ($var) { 
    case '0': 
     echo "0"; 
     break; 
    case 'a': 
     echo "a"; 
     break; 
}