Оператор переключения PHP: это правильно? - PullRequest
1 голос
/ 22 февраля 2011

Я посмотрел документацию по переключению на php.net и, насколько я могу судить, проверяет сравнение на равенство между переменной в переключателе и регистром.Однако следующий код, кажется, работает правильно для всех возможных значений (int, null, array, other):

$x = array('one','two');

switch ($x) {
   case null:
      echo "is null!";
      break;
   case is_int($x):
       echo "is int";
       break;
   case is_array($x):
      echo "is array!";
      break;
   default:
      echo "something else!";
      break;
}

Из того, что я прочитал, следует сравнить is_int ($ a) [true] с$ x [массив, который оценивается как true] и дает неверный результат.

Мой вопрос ... почему это на самом деле работает?

РЕДАКТИРОВАТЬ: извините, я не скопировал его совсемправильно, как я возился с этим.Теперь он в своей рабочей форме

Ответы [ 3 ]

1 голос
/ 22 февраля 2011

is_int($x) не оценивается как истина, если x является массивом. Это работает, потому что array('one', 'two') считается истинным, а is_array() оценивается как истинное. Это означает, что он не соответствует null или is_int($x) (последнее становится ложным). Если это int, тогда верно обратное и is_array($x) становится ложным. Если $x равно null, оно оценивается как false, как и null в коммутаторе. Дело null будет выполнено при любых обстоятельствах, где $x ложно (попробуйте это с false, array(), 0 и другими). ​​

0 голосов
/ 22 февраля 2011

Синтаксис правильный, но код не выполняет то, что вы думаете.

Если у вас есть выражение в качестве регистра переключателя

 case is_array($othervar):

Тогда это выражение не будет (1) не принимать во внимание фактическую переменную переключателя и (2) будет оцениваться до запуска переключателя. По сути, case станет

 case TRUE:

И это значение затем сравнивается с switch ($x), и именно поэтому оно может случайно работать в вашем примере.

0 голосов
/ 22 февраля 2011

Это поведение опирается на истинные и ложные значения:

$var = array(1, 2, 3);

// equivalent with if($var){
if($var == true){
  echo 'this will execute';
}

Значения типа 0 и array() являются ложными значениями, 1, "test" и array(1, 2) являются достоверными.

Если вы хотите сравнить тип, вы должны использовать ===, но это невозможно в операторе switch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...