Watch out for automatic type casting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I found automatic typecasting can be a bit of a gotcha.

 

$sText = "this.is.a.test.text";

if ( $pos = strpos($sText, "test") !== FALSE) {

                echo  substr($sText, 0, $pos)."<".substr($sText, $pos,
strlen("test")).">".substr($sText, $pos+strlen("test"));

}

 

The code seems logical enough, and the expected result would be:

this.is.a.<test>.text

 

In fact it ends up being:

t<his.>is.a.test.text

 

The reason is $pos is typecast as TRUE, not int 10, presumably because it's
in the same scope as the boolean test.

Then when $pos is later used as an int it's converted from TRUE to 1.

 

You have to bracket the $pos setting to move it into its own scope to
prevent it being typecast:

if ( ($pos = strpos($sText, "test")) !== FALSE) {

 

No doubt it's mentioned somewhere in the php manual, I just never came
across it.

Just thought I'd highlight one of the gotchas of auto typecasting for any
other simpletons like me.

 

Cheers

Arno


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux