代码之家  ›  专栏  ›  技术社区  ›  Aaron Yodaiken

make switch use==comparison not==php中的比较

  •  66
  • Aaron Yodaiken  · 技术社区  · 14 年前

    是否仍要使其成为以下代码仍使用开关并返回 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 回复  |  直到 5 年前
        1
  •  48
  •   Pang firemonkey    8 年前

    抱歉,您不能使用 === switch语句中的比较,因为根据 switch() documentation :

    请注意,开关/外壳没有进行比较。

    这意味着你必须想出一个解决办法。从 the loose comparisons table 你可以利用这个事实 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

        2
  •  7
  •   Gordon Haim Evgi    13 年前

    不与 switch -它只做所谓的“松散”比较。你总是可以用 if/else if 使用块 === .

        3
  •  3
  •   Matt Esch    13 年前

    假设您正在打开变量并期望整数。为什么不先用 is_int($val) ?

        4
  •  3
  •   caiofior    9 年前

    我在一个包含数字的字符串的开关中遇到了同样的问题(在一个用于PHP的开关中,“15.2”等于“15.20”)。

    我解决了在文本前加一个字母比较的问题

    $var = '15.20';
    switch ('#'.$var) {
        case '#15.2' :
          echo 'wrong';
        break;
        case '#15.20' :
          echo 'right';
        break;
    }
    
        5
  •  2
  •   thespacecamel    6 年前

    以下是“strict”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;
    }
    
        6
  •  1
  •   quantumSoup    14 年前

    使开关使用==比较不== PHP比较

    不幸地 switch 使用松散的比较,据我所知,没有办法改变这一点。

        7
  •  1
  •   Esteban    13 年前

    PHP中的switch语句只进行松散比较(==)请参见 http://www.php.net/manual/en/control-structures.switch.php

    如果需要严格比较,请使用if/else if/else。

        8
  •  1
  •   raveren    11 年前

    我只是用

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

    如果评论以 // 落在后面 # 最好删除)。

        9
  •  1
  •   Pang firemonkey    8 年前

    不。从 manual page :

    注意开关/外壳 loose comparison .

    如果只有两个条件,请使用 if 就像你的第二个例子。否则,检查 NULL 首先,打开其他可能性:

    if (is_null($var))
    {
      return 'a';
    }
    
    switch ($var)
    {
        // ...
    }
    
        10
  •  0
  •   strager    14 年前

    这是不可能的。

    但是,您可以将 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
  •  0
  •   Peter Ajtai    14 年前

    您还可以打开变量类型:

    switch (gettype($var)) {
    ...
    }
    
        12
  •  0
  •   Prem Kumar Maurya    10 年前

    最好的方法之一是使用 is_null

    <?php
    echo getValue();
    function getValue()
    {
        $var = 0;   
        switch(true) {
            case is_null($var) : return 'a'; break;
            default : return 'b'; break;
        }
    }
    ?>
    
        13
  •  0
  •   Gras Double    7 年前

    从您的示例代码推断,我猜您有一组常规案例和一个特殊案例(这里, null )

    我能想到的最简单的方法是在切换之前处理这个案例:

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

    也可以添加一条评论来记住 无效的 将意外匹配 0 案例(也是相反的, 将匹配 无效的 案例)。

        14
  •  0
  •   user1718888    5 年前

    创建类这样的断言,并在其中放入您想要的任何逻辑;只要“true”方法返回 $this (没有其他方法可以避免误报。)

    class Haystack
    {
        public $value;
    
        public function __construct($value)
        {
            $this->value = $value;
        }
    
        public function isExactly($n)
        {
            if ($n === $this->value)
                return $this;
        }
    }
    
    $var = new Haystack(null);
    
    switch ($var) {
        case $var->isExactly(''):
            echo "the value is an empty string";
            break;
    
        case $var->isExactly(null):
            echo "the value is null";
            break;
    }
    

    或者您可以将开关放在实际类中:

    class Checker
    {
        public $value;
    
        public function __construct($value)
        {
            $this->value = $value;
        }
    
        public function isExactly($n)
        {
            if ($n === $this->value)
                return $this;
        }
    
        public function contains($n)
        {
            if (strpos($this->value, $n) !== false)
                return $this;
        }
    
        public static function check($str)
        {
            $var = new self($str);
    
            switch ($var) {
                case $var->isExactly(''):
                    return "'$str' is an empty string";
                case $var->isExactly(null):
                    return "the value is null";
                case $var->contains('hello'):
                    return "'$str' contains hello";
                default:
                    return "'$str' did not meet any of your requirements.";
            }
        }
    }
    
    var_dump(Checker::check('hello world'));   # string(28) "'hello world' contains hello"
    

    当然,在这一点上,您可能需要重新评估您要用正在检查的内容做什么,并使用真正的验证库。

        15
  •  0
  •   Mohamed Ayoub BENJELLOUN    5 年前

    如果你想测试两者 价值 类型 创建一个新的 字符串变量 包含这两个信息并将其与不同的场景进行比较(通过串联),如果实现所有可能的类型(根据 gettype() documentation 例如:

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