Make switch use === сравнение нет == сравнение в PHP

Есть ли способ сделать так, чтобы следующий код все еще использовал переключатель и возвращает b not a? Спасибо!

$var = 0;
switch($var) {
    case NULL : return 'a'; break;
    default : return 'b'; break;
}

Используя инструкции if, вы, конечно, сделаете это так:

$var = 0;
if($var === NULL) return 'a';
else return 'b';

Но для более сложных примеров это становится многословным.

Ответ 1

Извините, вы не можете использовать сравнение === в инструкции switch, так как согласно switch() documentation:

Обратите внимание, что переключатель/случай не сравнивает сравнение.

Это означает, что вам придется придумать обходной путь. Из таблица сравнений вы можете использовать тот факт, что NULL == "0" является ложным по типу casting:

<?php
$var = 0;
switch((string)$var) 
{
    case "" : echo 'a'; break; // This tests for NULL or empty string   
    default : echo 'b'; break; // Everything else, including zero
}
// Output: 'b'
?>

Live Demo

Ответ 2

Один из способов сделать это - сделать то, что я думаю, как обратный переключатель (для этого может быть более официальное название). Идея состоит в том, что вы помещаете true или false вверху, а затем ваши условные выражения в операторы case.

switch(true)
{
  case ($var === NULL):
    return 'a';
    break;
  case ($var === 0):
    return 'b';
    break;
  default:
    return 'c';
}

Ответ 4

Предположительно, вы включаете переменную и ожидаете целые числа. Почему бы просто не проверить состояние целого числа переменной заранее, используя is_int($val)?

Ответ 5

У меня была такая же проблема в коммутаторе с строкой, содержащей числа ( "15.2" равно "15.20" в коммутаторе для php)

Я решил проблему, добавив письмо перед текстом, чтобы сравнить

$var = '15.20';
switch ('#'.$var) {
    case '#15.2' :
      echo 'wrong';
    break;
    case '#15.20' :
      echo 'right';
    break;
}

Ответ 6

Использовать коммутатор === сравнение нет == сравнение в PHP

К сожалению switch использует свободное сравнение, и насколько я знаю, нет способа изменить это.

Ответ 7

Неа. На странице руководства:

Обратите внимание, что switch/case делает свободное сравнение.

Если у вас есть только два условия, используйте if как ваш второй пример. В противном случае сначала проверьте NULL и включите другие возможности:

if (is_null($var))
{
  return 'a';
}

switch ($var)
{
    // ...
}

Ответ 9

Я просто использую

$var === null and $var = -1; // since switch is not type-safe
switch ( $var ) {
    case 0:
        # this tests for zero/empty string/false
        break;
    case -1:
        # this tests for null
        break;
}

Я думаю, что это все еще выглядит очень читаемым, если оставить комментарий, начинающийся с // (и те, которые начинаются с #, вероятно, лучше удаляются).

Ответ 10

Это невозможно.

Вы можете, однако, поместить операторы if внутри switch:

switch($var) {
    // Loose cases here

    case 0:
        if($var === NULL) {
            return 'a';
        }

        // Fall through

    default:
        return 'b';
}

Или просто:

switch($var) {
    // Loose cases here

    default:
        if($var === NULL) {
            return 'a';
        }

        return 'b';
}

Ответ 11

Вы также можете включить тип переменной:

switch (gettype($var)) {
...
}

Ответ 12

Один из лучших способов - проверить значение NULL с помощью is_null

<?php
echo getValue();
function getValue()
{
    $var = 0;   
    switch(true) {
        case is_null($var) : return 'a'; break;
        default : return 'b'; break;
    }
}
?>

Ответ 13

Экстраполируя из вашего примера кода, я думаю, у вас есть куча регулярных случаев и один специальный случай (здесь null).

Проще всего я могу понять, что нужно обработать этот случай перед коммутатором:

if ($value === null) {
    return 'null';
}

switch ($value) {
    case 0:
        return 'zero';
    case 1:
        return 'one';
    case 2:
        return 'two';
}

Возможно, также добавьте комментарий, чтобы запомнить null неожиданно будет соответствовать случаю 0 (также наоборот, 0 будет соответствовать случаю null).

Ответ 14

Вот ваш оригинальный код в "строгом" выражении switch:

switch(true) {
    case $var === null:
        return 'a';
    default:
        return 'b';
}

Это также может обрабатывать более сложные операторы switch, как это:

switch(true) {
    case $var === null:
        return 'a';
        break;
    case $var === 4:
    case $var === 'foobar':
        return 'b';
    default:
        return 'c';
        break;
}