Friday, 10 August 2018

PHP Variable Assignment Within If Statement

The usual practice when checking for the return value of functions is to run the function and store the value in a variable, and then test that variable. Here is an example of that process using the strstr() function.
  1. $string = 'abcde';
  2. $var = strstr($string, 'f');
  3. if ( false !== $var ) {
  4. var_dump($var);
  5. } else {
  6. var_dump($var);
  7. }
This code will output "bool(false)" as that was the return value of the strstr() function.
There is another way to write the same code within a single if statement. The following example assigns the variable and checks the return value in a single line of code.
  1. $string = 'abcde';
  2.  
  3. if ( false !== $var = strstr($string, 'f') ) {
  4. var_dump($var);
  5. } else {
  6. var_dump($var);
  7. }
This code will output "bool(false)" again as this has the same function as the previous example.
There is one problem with assigning variables in this way, and this is that you can only do one. If you try to assign more than one variable at a time you will find that everything but the final variable will turn out to be the outcome of the boolean comparison. Take the following example, which uses the same $string variable as the other examples.
  1. if ( false !== $var1 = strstr($string, 'a')
  2. && false !== $var2 = strstr($string, 'b')
  3. && false !== $var3 = strstr($string, 'c') ) {
  4. var_dump($var1, $var2, $var3);
  5. }
The output of this code will be as follows:
bool(true) bool(true) string(3) "cde"
The first two comparisons come out as true and so $var1 and $var2 are assigned boolean values of true. The final comparison is the only one that is assigned the expected value. This might be a bug in PHP, but as this is a non-standard way of assigning variables I don't think many people have come across it.
I dare say the last example is correct behaviour. This is what variables are actually assigned.
  1. ... $var1 = (strstr($string, 'a') && false !== $var2 = strstr($string, 'b') && false !== $var3 = strstr($string, 'c'))
  2. ... $var2 = (strstr($string, 'b') && false !== $var3 = strstr($string, 'c'))
to get expected behaviour all one needs is enclosing assignments within ().
  1. if ( false !== ($var1 = strstr($string, 'a'))
  2. && false !== ($var2 = strstr($string, 'b'))
  3. && false !== ($var3 = strstr($string, 'c'))) {
  4. var_dump($var1, $var2, $var3);
  5. }
also by doing that - in theory - you're helping compiler (for tiny speedup) so it doesn't need to find out operator precedence, just eval from insidemost statement(s).
This works too:
  1. if( !($val = $arg) )
  2. {
  3. $val = 'default';
  4. }

0 comments:

Post a Comment