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?
Value 0 and 1 is equal to false and true in php.
0 is the integer value of zero, and false is the boolean value of, well, false.
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.
== 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.
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.
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:
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With