Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

The Strpos Trap in PHP

DZone's Guide to

The Strpos Trap in PHP

· Web Dev Zone ·
Free Resource

Learn how error monitoring with Sentry closes the gap between the product team and your customers. With Sentry, you can focus on what you do best: building and scaling software that makes your users’ lives better.

This week I found myself again using strpos as an example of the difference between the == and === operators in PHP. The strpos function tells us where a string occurs within another string, by returning the character offset. If the string isn't found, then the function returns false.

The problem arises because if we simply check that there's a positive return value from the function, we'll miss the case where the string appears at the start of the other string since the character offset will be zero:

$tagline = "PHP Made Easy" ;
if ( strpos ( strtolower ( $tagline ) , 'php' ) ) {
    echo 'php tagline: ' . $tagline ;
}
 

This code won't find the "if" to be true, since strpos returns zero and PHP will type juggle that to be false (debates about dynamically typed languages can be saved for another day)

Correct Use of ===



This is a great example of where the === operator really helps, as it can tell the difference between false and zero:

$tagline = "PHP Made Easy" ;
if ( false !== strpos ( strtolower ( $tagline ) , 'php' ) ) {
    echo 'php tagline: ' . $tagline ;
}
 

This time, we'll correctly get into the "if" even if the string appears at the start of the other string.

Not a particularly complex example but I think one that is simple enough to serve as a reminder as to what that extra = is for!

What’s the best way to boost the efficiency of your product team and ship with confidence? Check out this ebook to learn how Sentry's real-time error monitoring helps developers stay in their workflow to fix bugs before the user even knows there’s a problem.

Topics:

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}