использовать переключатель === сравнение не == сравнение в PHP - PullRequest
67 голосов
/ 19 августа 2010

Есть ли способ сделать так, чтобы следующий код по-прежнему использовал переключатель и возвращал b, а не 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';

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

Ответы [ 15 ]

48 голосов
/ 19 августа 2010

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

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

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

<?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

7 голосов
/ 26 января 2012

Не с switch - он выполняет только так называемые "свободные" сравнения.Вы всегда можете заменить его блоком if/else if, используя ===.

4 голосов
/ 11 января 2019

Вот ваш оригинальный код в «строгом» выражении 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;
}
3 голосов
/ 27 февраля 2015

У меня была такая же проблема в коммутаторе со строкой, содержащей числа («15,2» равен «15,20» в коммутаторе для php)

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

$var = '15.20';
switch ('#'.$var) {
    case '#15.2' :
      echo 'wrong';
    break;
    case '#15.20' :
      echo 'right';
    break;
}
3 голосов
/ 26 января 2012

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

1 голос
/ 30 августа 2013

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

$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;
}

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

1 голос
/ 26 января 2012

Оператор switch в php выполняет только произвольные сравнения (==) см. http://www.php.net/manual/en/control-structures.switch.php

Используйте if / elseif / else, если вам нужны строгие сравнения.

1 голос
/ 19 августа 2010

Неа.Из справочной страницы :

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

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

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

switch ($var)
{
    // ...
}
1 голос
/ 19 августа 2010

make switch use === сравнение не == сравнение В PHP

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

0 голосов
/ 19 марта 2019

Если вы хотите проверить значение и тип вашей переменной, то создайте новую строковую переменную , содержащую обе информации, и сравните ее с вашими различными сценариями (конкатенацией) он должен работать для вашего случая, если вы реализуете все возможные типы (в соответствии с gettype () документацией ), пример:

<?php
    $var= 9999;
    $valueAndTypeOfVar = (string)$var.' '.gettype($var);
    switch($valueAndTypeOfVar) {
        case "$var boolean" : echo 'a'; break;
        case "$var integer" : echo 'b'; break; 
        case "$var double" : echo 'c'; break;
        case "$var string" : echo 'd'; break; 
        case "$var array" : echo 'e'; break;
        case "$var object" : echo 'f'; break; 
        case "$var resource" : echo 'g'; break;
        case "$var NULL" : echo 'h'; break; 
        case "$var unknown type" : echo 'i'; break; 
        default: echo 'j'; break;
    }

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