Php 为什么对strstr的调用没有返回false?

Php 为什么对strstr的调用没有返回false?,php,string,casting,strstr,Php,String,Casting,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($lin

我在一个旧的遗留代码库中偶然发现了一个问题。有很多代码,但基本上测试用例可以归结为:

$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));
我希望它返回
false
,因为“2660”不在字符串中,但它返回
d=1449&zoneid=6011&placement\u id=11736&publisher\u id=1449&period\u preset=beday&period\u start=2017-03-27&period\u end=2017-03-27

我意识到,
$value
应该是一个字符串,但我仍然不明白为什么PHP没有将其转换为字符串,为什么它会在链接中找到这个数字

实际上,如果我尝试使用
$value='2660'按预期返回
false


知道发生了什么吗?

我想这回答了你的问题:


如果指针不是字符串,则将其转换为整数并 作为字符的序数值应用

因评论而编辑:

chr(2660)
返回字符
d
,这确实是大海捞针,这就是为什么它不会像您预期的那样返回false。

简短回答 运行
strstr($str,2660)
时,通过调用
chr(2660)
$needle
解析为字符“d”,因此它在给定的
$str
中找到的第一个“d”处停止,在本例中正好在第11个字符处


我们为什么打电话给chr(2660)
? 因为当
$needle
不是字符串时,将该参数强制转换为整数,并使用该位置的相应字符,其中
chr(2660)
是“d

如果指针不是字符串,它将转换为整数并作为字符的序数值应用


但是为什么
chr(2660)
在“d”是
ord(100)
时返回“d? 因为超出有效范围
[0-255]
的值将按位并与
255
相加,这相当于以下算法

while($ascii<0){
$ascii+=256;
}
$ascii%=256;
因此,
2660
变为
100
,然后当传递到时,它被用作字符的序数值,并查找字符“d

困惑。我还希望它被转换成字符串,但这就是我们在编程中假设的结果。这至少是记录在案的;你会惊讶地发现,奇怪的事情发生的次数如此之多,而且没有官方的解释。至少不像你提供的链接那样简单


为什么它被命名为strstr? 我做了一点研究,发现 美国国家标准 关于信息系统- 程序设计语言- C) 从1989年开始,他们将所有与字符串相关的函数命名为前缀
str
,这是合乎逻辑的,然后,由于PHP的源代码是用C编写的,它将解释为什么它带有字符串。我最好的猜测是,我们正在另一个string内部搜索一个string,他们说:

strstr功能是委员会的发明。包括在内 作为高效子字符串算法的挂钩,或用于内置 子字符串指令

有用的文档
  • 文件
  • 文件
  • 古怪的好来源


只需将其字符串化
var_dump(strstr($link,(string)$value))PHP不是一种严格的语言,在比较不同类型时,往往会产生奇怪的结果。就像
(1==“a1”)
等于真。请原谅我的无知,但是。。。“strstr”是什么意思?我查看了文档,我真的不知道为什么这个函数会有这么奇怪的名字!是“迷途的绳子”吗?“在此范围内搜索字符串”?“字符串”?@Tsar,是的,它既不是一个好名字也不是一个好函数。它可能来自strpos,它返回第一次出现的位置,而strstr在第一次出现时返回字符串。@TSar:
strstr
在另一个字符串中找到一个字符串。不要为此责备PHP;这个名字来自C.@jwodder,呃,这不是借口:P,而是公平点。C被认为是真正的。。。呃,比如说,关于一些命名的决定,我一点也不惊讶!,,,那么2660是哪个角色?!:)哪个。。。是的,我在谷歌上搜索了“spade”,但@juancortés后来回答说char(2660)是个d。有趣的是,
ord(“♠")给出了
226
chr(2660)
给出了
d
!@domdom,确切地说,这就是我写的作为回应的东西。而且
d
确实在大海捞针。我查看了一下,很明显它检查除法256
$ascii%=256;
,因此2660变成了100,这是
d
。这实际上是一个非常奇怪的创造。是的,它是在PHP文档,。还有,这里的第一条评论确实说明了这一点:“注意,如果数字大于256,它将返回mod 256的数字。”。奇怪的是,在返回值或参数部分没有更清楚地指出这一点。好吧,PHP通常带有大量令人困惑的奇怪东西
while ($ascii < 0) {
    $ascii += 256;
}
$ascii %= 256;