Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 if the variable is 0. I've came across this when an array for a special key and wondered why it's wasn't working as expected. See this code for an example.

$key = 1; if ($key != 'Hello') echo 'Hello'; //echoes hello  $key = 2; if ($key != 'Hello') echo 'Hello'; //echoes hello  $key = 0; if ($key != 'Hello') echo '0Hello'; //doesnt echo hello. why? if ($key !== 'Hello') echo 'Hello'; //echoes hello 

Can anyone explain this?

like image 423
Tim Avatar asked May 05 '11 07:05

Tim


People also ask

Which value is equal to true in PHP?

Value 0 and 1 is equal to false and true in php.

Is 0 true or false in PHP?

0 is the integer value of zero, and false is the boolean value of, well, false.

What does return true mean in PHP?

Sometimes a method/function returns a boolean value to indicate if the operation was succesfull. In the given example it always returns "TRUE". The calling code can then act upon succesfull completion of the code.

What does == and === mean in PHP?

== Operator: This operator is used to check the given values are equal or not. If yes, it returns true, otherwise it returns false. Syntax: operand1 == operand2. === Operator: This operator is used to check the given values and its data type are equal or not. If yes, then it returns true, otherwise it returns false.


2 Answers

The operators == and != do not compare the type. Therefore PHP automatically converts 'Hello' to an integer which is 0 (intval('Hello')). When not sure about the type, use the type-comparing operators === and !==. Or better be sure which type you handle at any point in your program.

like image 160
ZoolWay Avatar answered Sep 17 '22 19:09

ZoolWay


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

like image 22
martinstoeckli Avatar answered Sep 21 '22 19:09

martinstoeckli