Почему этот вызов strstr не возвращает false?

Я наткнулся на проблему с 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 как и ожидалось.

Есть идеи, что происходит?

16

Решение

Короткий ответ

Когда ты бежишь 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 является изобретением Комитета. Включен
как ловушка для эффективных алгоритмов подстроки или для встроенного
инструкции подстроки.

Полезные документы

  • Документация для strstr
  • Документация для chr
  • PHPwtf хороший ресурс для странностей

38

Другие решения

Я думаю, что это отвечает на ваш вопрос:

игла
Если игла не является строкой, она преобразуется в целое число и
применяется в качестве порядкового значения символа.

http://php.net/manual/en/function.strstr.php

Редактировать из-за комментариев:

chr(2660) возвращает персонажа d, который действительно находится в стоге сена, и поэтому он не вернет ложь, как вы ожидали.

8

По вопросам рекламы [email protected]