【问题标题】:How to handle a PHP switch with different types?如何处理不同类型的 PHP 开关?
【发布时间】:2011-07-30 14:28:31
【问题描述】:

我怎样才能让开关尊重数据类型(有没有比 if/else 更好的解决方法)?

  • $值=假; // 应该回显 false
  • $值=空; // 应该回显 null 开关($值){ 案例“0”: 回声“零”; 休息; 案子 '' : 回声“空”; 休息; 案例空: 回声“空”; 休息; 案例错误: 回声“假”; 休息; 默认 : 回声'默认'; 休息; }

    结论

  • 开关/外壳进行松散比较。
  • 解决方案:使用 ifs 或 if/else 切换
  • 【问题讨论】:

    • “不工作”是指:尊重或以某种方式考虑价值类型
    • 让我们再试一次,你希望发生什么?
    • 哦,来吧,我们不谈语义。如果它是布尔假,它应该回显假。
    • 你需要明确。在这种情况下,脚本正在“工作”,它只是没有按照您的预期进行。
    • @Hamish,我们don't want loose comparisons。 '纳夫说,清澈如水。

    标签: php


    【解决方案1】:

    另一种选择,取决于你喜欢看什么:

    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”,但它不像 IMO 那样干净。

    就个人而言,我同意接受的答案,例如快速空检查:

    case $foo === null:
    

    【讨论】:

    • 我真的很喜欢你的解决方案。您能否详细说明$foo ?: strtoupper(gettype($foo)) 部分——特别是?: 运算符?我在想 strtoupper(gettype($foo)) 应该就足够了,但这只是因为我不知道 ?: 运算符的作用。 ... +1 表示没有将true 放在 switch 语句中(实际上是打开数据类型)! :D
    • ?: 是 PHP 中的三元运算符。这是 if/then 语句的简写。像$x = (($a > $b) ? $a : $b); PHP 让你省略“真”条件,如:$x = $a ?: $b; 所以它检查 $a 是否为真,如果是,选择 $a 否则选择 $b。所以在上面的开关中,它使用 $foo 的值,除非它是假的。然后下面是它评估的“假”数据类型。 (我不会专业地编写这个代码。如果你在这一点上,可能应该进一步简化一些事情以避免错误。)
    【解决方案2】:
    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';
    }
    

    【讨论】:

    • 不同意可读性部分(一个额外的缩进级别,相同数量的行(如果你格式化 if/else 比 @nicola 更好)和表达你的内容的更直接的方式下一步为什么会这样读(wtf factor @switch(true) 一秒钟)。但我在吹毛求疵。+1
    • 嘿,嘎嘎,多么好的技巧啊,好想法,让我了解了“开关”的实际运作方式
    • @edorian: 嗯......我用“我认为,它更易读”替换了“可读性更强”;)但我仍然认为,它比(比如说)3 oder 更干净4例。使用switch(true),每个case 语句都被评估为true == ($statement)。我想,这很明显。
    • 等等,我讨厌使用'switch',因为如果我们错过了'break;'然后一切都崩溃了
    • switch(true) 是一个非常糟糕的结构
    【解决方案3】:

    php.net 手册中它是一个

    注意:请注意 switch/case 是 loose comparision

    "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
    

    【讨论】:

      【解决方案4】:

      我相信您可以尝试使用 if-then 来方便使用 '===' 代替:

      <?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";
      }
      ?>
      

      【讨论】:

      • 好吧,几年前的回答 :) 但无论如何:当我阅读最左边的栏时——这就是我快速追踪代码的方式——我看到了几个ifs。很容易错过else,这使得if 变为elseif,因此我首先看到了几个独立的条件,而不是链。我不会推荐这种表示法。
      【解决方案5】:

      请记住,您要求 PHP 发送至 juggle types

      如果您看到PHP type comparison table,您会看到,例如,null'' 大致等价,即null == ''

      【讨论】:

      • 是的,他在问如何让 PHP 来处理类型。
      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 2014-01-22
      • 1970-01-01
      相关资源
      最近更新 更多