Я наткнулся на проблему с 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));
Я ожидаю, что это вернется 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
как и ожидалось.
Есть идеи, что происходит?
Когда ты бежишь strstr($str, 2660)
$needle
решается на характер «d« позвонив chr(2660)
и поэтому он останавливается на первом «d« найдено в данном $str
в данном случае прямо на 11-м персонаже.
chr(2660)
?Потому что когда $needle
это не строка strstr
преобразует этот аргумент в целое число и использует соответствующий символ для этой позиции из расширенный код ASCII где chr(2660)
является «d«.
Если игла не является строкой, она преобразуется в целое число и применяется в качестве порядкового значения символа.
chr(2660)
вернуть «d« когда «d« является ord(100)
?Потому что значения за пределами допустимого диапазона [0-255]
будет побитовым и с 255
, что эквивалентно следующему алгоритму[источник]
while ($ascii < 0) {
$ascii += 256;
}
$ascii %= 256;
Так, 2660
становится 100
, а затем, когда передается strstr
он используется как порядковый номер символа и ищет символ «d«.
Смешение? да. Я также ожидал, что он будет приведен к строке, но это то, что мы получаем, предполагая что-то в программировании. Это, по крайней мере, задокументировано; вы будете удивлены количеством раз что-то странный случается, и нет никаких официальных объяснений. По крайней мере, не так легко, как по той же ссылке, которую вы указали.
strstr
?Я сделал небольшое исследование и нашел этот драгоценный камень (Обоснование для
Американский национальный стандарт
для информационных систем —
Язык программирования —
В) со всех концов 1989 года, где они назвали все функции, относящиеся к строкам, с префиксом str
что логично, то, поскольку исходный код PHP написан на C, он объяснит, почему он несет. Мое лучшее предположение, что мы ищем улвнутри другого улНо они говорят:
Функция strstr является изобретением Комитета. Включен
как ловушка для эффективных алгоритмов подстроки или для встроенного
инструкции подстроки.
Я думаю, что это отвечает на ваш вопрос:
игла
Если игла не является строкой, она преобразуется в целое число и
применяется в качестве порядкового значения символа.
http://php.net/manual/en/function.strstr.php
Редактировать из-за комментариев:
chr(2660)
возвращает персонажа d
, который действительно находится в стоге сена, и поэтому он не вернет ложь, как вы ожидали.