lau*_*ent 16 php string casting strstr
我在旧的遗留代码库中偶然发现了strstr的问题.有很多代码,但基本上测试用例将归结为:
$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));
Run Code Online (Sandbox Code Playgroud)
我希望这会返回,false
因为"2660"不在字符串中,但它返回d=1449&zoneid=6011&placement_id=11736&publisher_id=1449&period_preset=yesterday&period_start=2017-03-27&period_end=2017-03-27
.
我意识到这$value
应该是一个字符串,但我仍然不明白为什么它没有被PHP转换成字符串,为什么它在链接中找到这个数字.
实际上,如果我尝试使用$value = '2660';
它会false
按预期返回.
知道发生了什么事吗?
Jua*_*tés 38
当你运行时strstr($str, 2660)
,通过调用$needle
解析为字符" d "chr(2660)
,因此它在给定的第一个" d "处停止$str
,在这种情况下在第11个字符处.
chr(2660)
?因为当$needle
不是字符串strstr
蒙上这样的说法成整数并使用从该位置对应的字符扩展的ASCII码,其中chr(2660)
是" d ".
如果needle不是字符串,则将其转换为整数并应用为字符的序数值.
chr(2660)
返回" d "时," d "是ord(100)
?因为有效范围之外的值[0-255]
将按位进行255
,这相当于以下算法[source]
while ($ascii < 0) {
$ascii += 256;
}
$ascii %= 256;
Run Code Online (Sandbox Code Playgroud)
所以,2660
变成100
,然后传递给strstr
它时,它被用作角色的序数值,并寻找字符" d ".
混乱?是的.我也期望它被转换成一个字符串,但这就是我们在编程中假设的东西.这至少记录在案; 你会发现一些奇怪的事情并且找不到正式的解释,你会感到惊讶.至少不像遵循您提供的相同链接那样容易.
strstr
?我做了一些研究,发现这个宝石(美国国家信息系统标准的基本原理 - 编程语言 - C)从1989年开始,他们将所有与字符串相关的函数命名为具有str
逻辑的前缀,然后从PHP的源代码是用C语言编写的,它将解释它为什么会带来.我最好的猜测是,我们正在寻找一个STR荷兰国际集团内另一海峡 ING,他们说:
strstr功能是委员会的一项发明.它作为高效子字符串算法的钩子或内置子字符串指令包含在内.
我想这回答了你的问题:
needle
如果needle不是字符串,则将其转换为整数并应用为字符的序数值.
http://php.net/manual/en/function.strstr.php
由于评论而编辑:
chr(2660)
返回字符d
,这确实在大海捞针中,这就是为什么它不会像你预期的那样返回false.
归档时间: |
|
查看次数: |
1749 次 |
最近记录: |