Как я могу заставить коммутатор уважать типы данных (есть ли временное решение лучше, если / else)?
switch ($ value) { case '0': echo 'zero'; ломать; дело '' : echo 'empty'; ломать; case null: echo 'null'; ломать; case false: echo 'false'; ломать; по умолчанию : echo 'default'; ломать; }
switch (true) { case $value === '0' : echo 'zero'; break; case $value === '' : echo 'empty'; break; case $value === null : echo 'null'; break; case $value === false : echo 'false'; break; default : echo 'default'; break; }
Я думаю, это более читаемо, чем if-elseif
-chain, как показано ниже:
if ($value === '0') { echo 'zero'; } else if ($value === '') { echo 'empty'; } else if ($value === null) { echo 'null'; } else if ($value === false) { echo 'false'; } else { echo 'default'; }
я считаю, что вы можете попробовать, если-то, чтобы облегчить использование '===' вместо этого:
<?php $value = 0; if ($value==="") { echo "blank (string)"; } else if ($value==="0") { echo "zero (string)"; } else if ($value===false) { echo "false (boolean)"; } else if ($value===null) { echo "null (object)"; } else if ($value===0) { echo "zero (number)"; } else { echo "other"; } ?>
в руководстве php.net это
Примечание. Обратите внимание, что переключатель / случай не выполняет сравнения .
"loose comparison" means that switch won't check the type. switch will only compare values:
<?php if('a string' == 0) echo 'a string is 0' . PHP_EOL; if('a string' === 0) echo 'but you will never see this' . PHP_EOL; switch(0){ case 'a string': echo 'a string' . PHP_EOL; case 'another string': echo 'another string' . PHP_EOL; } if('a string' == true) echo 'a string is TRUE' . PHP_EOL; if('a string' === true) echo 'but you will never see this' . PHP_EOL; switch(true){ case 'a string': echo 'a string' . PHP_EOL; case 'another string': echo 'another string' . PHP_EOL; } ?> will output: a string is 0 a string another string a string is TRUE a string another string
Не забывайте, что вы просите PHP манипулировать типами .
Если вы увидите таблицу сравнения типов PHP, вы увидите, что, например, null
и ''
эквивалентны, то есть null == ''
.
другой вариант, в зависимости от того, что вам нравится:
switch($foo ?: strtoupper(gettype($foo))){ case 'bar': case 'bork': echo $foo; break; case 'NULL': // $foo === null echo 'null'; break; case 'INTEGER': // $foo === 0 echo 'zero'; break; case 'ARRAY': // $foo === array() echo 'array'; break; case 'STRING': // $foo === '' echo 'empty'; break; case 'BOOLEAN': // $foo === false echo 'false'; break; default: echo $foo; break; }
в зависимости от ваших данных вы можете добавить подчеркивание для дополнительной ясности, например «_NULL», но это не так чисто ИМО.
лично, я согласен с принятым ответом на что-то вроде быстрой проверки нуля:
case $foo === null: