PHP - reversed order in if statement

2019-02-16 19:42发布

问题:

This is a question that is bugging me for a long time and can't find any answer... Noticed it's used quite a lot by Zend Framework Developers,

What is the difference between following 2 "if" statements? :

if (null === $this->user) { ... }

if ($this->user === null) { ... }

To me the first one looks kinda odd ;]

Thanks for answer.

回答1:

This is not a difference for the way your script works, it's just a coding standard, a recommendation

The reason why it is recommended to use it this way:

if (null == $this->user)

is the fact that if you mistype and write = instead of == you will get an error, while

($this->user = null)

instead of

($this->user == null)

works but causes weird bugs (assignment and the final value is evaluated as bool instead of comparison)

and I guess it just extended as a habit to the strict comparison operator (===)

Update: since I see that there's still some activity on this thread even 3 years after I posted the answer I figured I would add something I forgot to mention. This type of notation is known as yoda conditions, you can read more about it on this wikipedia page for example.



回答2:

It is a good practice for writing if statement. Consider this code:

if (10 == $var) {
  echo 'true';
} else {
  echo 'false';
}

If you forgot one equal sign:

if (10 = $var) { }

Then PHP will generate parse error, so you know you missed one = and you can fix it. But this code:

if ($var = 10) { }

will assign 10 to $var and always evaluates to true condition. Whatever the contents of $var, the code above will always echo 'true' and its very difficult to find this bug.



回答3:

There is no difference in order when comparing values.

It may be easier for someone to read or write such a code, but to me it's the same as writing from right to left.



回答4:

Such order of elements in comparison I think is meant to prevent accidental assignment in if statements.



回答5:

The result will be the same, however, the second is logical. You want to check if the variable is NULL, not if NULL is the variable... The reason for doing it the other way around is described here: http://umumble.com/blogs/Programming/321/



回答6:

These are called yoda conditions.

The idea is that if you put the value first (such as false, null, true or anything short) it becomes easier for a person to scan the statement and quickly understand the intention of the condition.

Also, what mishu said :)



回答7:

If you accidentally write:

if (null = $this->user) { ... }   

you will get a syntax error.

If you accidentally write:

if ($this->user = null) { ... }

you will be searching for a reason of strange behavior of your application for a long time.