Why does (0 == 'Hello') return true in PHP?

后端 未结 5 1374
南方客
南方客 2020-12-03 16:53

Hey, if you have got the following code and want to check if $key matches Hello I\'ve found out, that the comparison always returns true

5条回答
  •  旧巷少年郎
    2020-12-03 17:22

    Others have already answered the question well. I only want to give some other examples, you should be aware of, all are caused by PHP's type juggling. All the following comparisons will return true:

    • 'abc' == 0
    • 0 == null
    • '' == null
    • 1 == '1y?z'

    Because i found this behaviour dangerous, i wrote my own equal method and use it in my projects:

    /**
     * Checks if two values are equal. In contrast to the == operator,
     * the values are considered different, if:
     * - one value is null and the other not, or
     * - one value is an empty string and the other not
     * This helps avoid strange behavier with PHP's type juggling,
     * all these expressions would return true:
     * 'abc' == 0; 0 == null; '' == null; 1 == '1y?z';
     * @param mixed $value1
     * @param mixed $value2
     * @return boolean True if values are equal, otherwise false.
     */
    function sto_equals($value1, $value2)
    {
      // identical in value and type
      if ($value1 === $value2)
        $result = true;
      // one is null, the other not
      else if (is_null($value1) || is_null($value2))
        $result = false;
      // one is an empty string, the other not
      else if (($value1 === '') || ($value2 === ''))
        $result = false;
      // identical in value and different in type
      else
      {
        $result = ($value1 == $value2);
        // test for wrong implicit string conversion, when comparing a
        // string with a numeric type. only accept valid numeric strings.
        if ($result)
        {
          $isNumericType1 = is_int($value1) || is_float($value1);
          $isNumericType2 = is_int($value2) || is_float($value2);
          $isStringType1 = is_string($value1);
          $isStringType2 = is_string($value2);
          if ($isNumericType1 && $isStringType2)
            $result = is_numeric($value2);
          else if ($isNumericType2 && $isStringType1)
            $result = is_numeric($value1);
        }
      }
      return $result;
    }
    

    Hope this helps somebody making his application more solid, the original article can be found here: Equal or not equal

提交回复
热议问题