PHP, возвращающий тип данных с переключателем против другого - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь выяснить, почему логика if / else возвращает правильные типы данных по сравнению с переключателем, который этого не делает.

IF / ELSE:

$value = false;
var_dump($value);

if(is_int($value)) {
  echo "INT";
} elseif (is_bool($value)) {
  echo "BOOL";
} elseif (is_null($value)) {
  echo "NULL";
} else {
  echo "DEFAULT";
}

SWITCH:

$value = false;
var_dump($value);

switch ($value) {
  case is_int($value):
    echo "INT";
    break;        
  case is_bool($value):
    echo "BOOL";
    break;
  case is_null($value):
    echo "NULL";
    break;
  default:
    echo "DEFAULT";
}

Я не использую строгое сравнение в if / else. Не уверен, что происходит. Кто-нибудь?

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Когда вы пишете

switch ($variable) {
case <expression>:
    ...
    break;
}

это эквивалентно написанию:

if ($variable == <expression>) {
    ...
}

То есть ваши дела аналогичны написанию

if ($value == is_int($value)) {

что не совпадает с

if (is_int($value)) {

Хотя я лично считаю это плохим тоном, некоторые люди любят писать:

switch (true) {
case is_int($value):
    ...
    break;
case is_bool($value):
    ...
    break;
...
}
0 голосов
/ 02 мая 2018

Если вы хотите, чтобы ваш оператор switch работал .. Вы должны switch (gettype($value)) - который проверяет тип вашей переменной по отношению к всему оператору ... тогда case 'boolean':, например, проверит для boolean

Дословный перевод того, как это выглядело бы в вашем случае:

$value = false;
var_dump($value);

switch (gettype($value)) {
  case 'integer':
    echo "INT";
    break;        
  case 'boolean':
    echo "BOOL";
    break;
  case 'NULL':
    echo "NULL";
    break;
  default:
    echo "DEFAULT";
}

Со следующим types можно проверить:

boolean
integer
double
string
array
object
resource
NULL
unknown type
0 голосов
/ 02 мая 2018

switch сравнивает значение с делами, вот как ваш код выполняется

$value = FALSE;

var_dump(is_int($value)); // Gives FALSE

switch ($value) {
  // PHP runs is_int first and it returns FALSE
  // It becomes "case FALSE:" (Which is correct, $value is FALSE)
  // So INT is printed
  case is_int($value): 
....

Правильный способ проверки типа с помощью switch находится в ответе @ zak .

...