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 次 |
| 最近记录: |