<?php
$a = 5;
$b = 3 + 2;
echo ($a == $b ? "true" : "false");
?>
$a = 5;
$b = 3 + 2;
echo ($a == $b ? "true" : "false");
?>
true
This is true because the variable $b is set to (3+2), which is 5. The value of $a is also 5, therefore $a and $b are numerically equal.
Now consider this.
<?php
$a = 5;
$b = 2.5 * 2;
echo ($a == $b ? "true" : "false");
?>
$a = 5;
$b = 2.5 * 2;
echo ($a == $b ? "true" : "false");
?>
true
Again, $a and $b are numerically equal. $b is set to (2.5*2), which is 5.0, which is the numerical equivalent of $a.
Does this then follow that $a is equal to $b? Mathematically, yes. In programming parlance, no. Try the same code, with the following change.
<?php
$a = 5;
$b = 2.5 * 2;
echo ($a === $b ? "true" : "false");
?>
$a = 5;
$b = 2.5 * 2;
echo ($a === $b ? "true" : "false");
?>
false
The extra Equal sign
When you use the === operator rather than the == operator, you are testing for one more condition - that not only must $a and $b be numerically equivalent, they must be of the same data type. $a is 5, which is an integer. $b is 5.0, which is a floating point!Now, how about this...
<?php
$a = true;
$b = 1;
echo ($a === $b ? "true" : "false");
?>
$a = true;
$b = 1;
echo ($a === $b ? "true" : "false");
?>
false
$a is true, and numerically, that is 1. $b is set to the integer value of 1. Numerically they are equal, but $a is a Boolean and $b is an integer.
<?php
$a = intval(true);
$b = 1;
echo ($a === $b? "true" : "false");
?>
$a = intval(true);
$b = 1;
echo ($a === $b? "true" : "false");
?>
true
The result is true. That is because $b is the integer 1. $a has been set to the integer value of true, which is 1. Therefore they are equivalent, both numerically, and in data type.
Why is this important?
If you want to compare only numerical equality, you use the == operator. And in cases where you wish to compare total equivalence, you use the === operator.Say, for instance, you wanted to tally the items in a shopping cart. The total amount will then be processed to see if the shopper is entitled to a free gift. For arguments' sake, let's set that cut-off point at $50.00.
Item | Qty | Unit Price | Subtotal |
Cherries | 30 |
0.35
10.50
Oranges
10
1.00
10.00
Grapefruit
5
2.05
10.25
Peaches
15
1.55
23.25
The total is $54.00, so....
<?php
if ($cart_total >= 50)
{
echo "Congratulations! You are eligible for a mystery gift!";
}
?>
if ($cart_total >= 50)
{
echo "Congratulations! You are eligible for a mystery gift!";
}
?>
See the comparison operator? It didn't rely on an extra Equal sign. That is because it doesn't matter if the total is an integer or a floating point; what we are interested in is the numerical value, and nothing else.
For a counter-example, let's take a look at PHP's search_array() function. For this, let's declare an array, $arr.
<?php
$arr = array("cherry", "orange", "pear", "banana");
?>
$arr = array("cherry", "orange", "pear", "banana");
?>
Now, if we were to search for "cherry" within this array, what would we get?
<?php
echo (array_search("cherry", $arr));
?>
echo (array_search("cherry", $arr));
?>
0
We get 0 because that's the index position of "cherry" within the array $arr. But what if we wanted simply to check for the existence of "cherry"?
<?php
echo (array_search("cherry", $arr) == false ? "true" : "false");
?>
echo (array_search("cherry", $arr) == false ? "true" : "false");
?>
true
This is incorrect, because it is untrue that "cherry" is not found in the array $arr. The function returned an integer 0 because that is the index value of "cherry", as shown earlier. However, we used the == operator to compare it to false, which has the same numerical value as 0.
Thus, to eliminate ambiguity, we do this.
<?php
echo (array_search("cherry", $arr) === false ? "true" : "false");
?>
echo (array_search("cherry", $arr) === false ? "true" : "false");
?>
false
Here, we explicitly state that we're looking for a Boolean 0, not just any 0 value.
To conclude...
The extra Equal sign in PHP may cause some confusion. Hopefully, after explaining the concept of equivalence, things will be that much clearer.
Thanks very much. I cherry-sh your readership!
T___T
T___T