php - Why is this call to strstr not returning false? -
i've stumbled upon issue strstr in old legacy codebase. there's lot of code, test case come down this:
$value = 2660; $link = 'affiliateid=1449&zoneid=6011&placement_id=11736&publisher_id=1449&period_preset=yesterday&period_start=2017-03-27&period_end=2017-03-27'; var_dump(strstr($link, $value)); i expect return false since "2660" not in string returns d=1449&zoneid=6011&placement_id=11736&publisher_id=1449&period_preset=yesterday&period_start=2017-03-27&period_end=2017-03-27.
i realise $value should string still don't understand why it's not casted string php , why it's finding number in link.
actually, if try $value = '2660'; returns false expected.
any idea what's happening?
short answer
when run strstr($str, 2660) $needle resolved character "d" calling chr(2660) , therefore stops @ first "d" found in given $str, in case right @ 11th character.
why calling chr(2660)?
because when $needle not string strstr casts argument integer , uses corresponding character position extended ascii code chr(2660) "d".
if needle not string, converted integer , applied ordinal value of character.
but why chr(2660) return "d" when "d" ord(100)?
because values outside valid range [0-255] bitwise and'ed 255, equivalent following algorithm[source]
while ($ascii < 0) { $ascii += 256; } $ascii %= 256; so, 2660 becomes 100, , when passed strstr it's used ordinal value of character , looks character "d".
confusing? yes. expected casted string, that's assuming things in programming. this, @ least, documented; you'd surprised amount of times weird happens , there's no official explanation found. @ least not following same link provided.
why named strstr?
i did little bit of research , found this gem (rationale american national standard information systems - programming language - c) way 1989 named functions relating strings prefix str logical, since php's source written in c explain why has carried. best guess searching string inside string, say:
the strstr function invention of committee. included hook efficient substring algorithms, or built-in substring instructions.
Comments
Post a Comment