Ответ 1
Короткий ответ
Когда вы выполняете 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
?
Я немного поработал и нашел этот камень (Обоснование для
Американский национальный стандарт для информационных систем - Язык программирования -
C) со всего 1989 года, где они назвали все функции, относящиеся к строкам, с префиксом str
, который является логическим, тогда, поскольку источник PHP написан на C, он объяснит, почему он перенес. Лучше всего предположить, что мы ищем str внутри другого str, они говорят:
Функция strstr является изобретением Комитета. Он включен как крючок для эффективных алгоритмов подстроки или для встроенных подстроки.