Что если параметр ‘needle’ функции strpos () содержит преобразованное целочисленное значение, которое нельзя применять в качестве порядкового значения какого-либо символа?

я использую PHP 7.2.8 на моей машине, работающей на Операционная система Windows 10.

Я наткнулся на следующий текст из описание параметра ‘needle’ в функции strpos () дано в руководстве по PHP:

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

Из приведенного выше утверждения о «Игла» параметр я не понимаю, как работает функция strpos(); работают, когда параметр ‘needle’ функции strpos () содержит преобразованное целочисленное значение, которое нельзя применять в качестве порядкового значения какого-либо символа.

Может кто-нибудь объяснить, пожалуйста, фактический смысл утверждения из руководства, когда параметр ‘needle’ функции strpos () содержит преобразованное целочисленное значение, которое не может быть применено в качестве порядкового значения какого-либо символа в простой для понимания, простой и понятной язык?

Для меня и других обучающихся было бы лучше, если бы вы могли предоставить пару подходящих примеров рабочего кода: strpos() функция, где параметр ‘needle’ функции strpos () содержит преобразованное целочисленное значение, которое нельзя применять в качестве порядкового значения какого-либо символа.

Благодарю вас.

0

Решение

Любое значение (в пределах разумного), указанное как игла будет преобразован в символ (тип данных внутри C, размер которого составляет один байт). Соответствующий код из текущей реализации strpos:

/* {{{ php_needle_char
*/
static int php_needle_char(zval *needle, char *target)
{
switch (Z_TYPE_P(needle)) {
case IS_LONG:
*target = (char)Z_LVAL_P(needle);
return SUCCESS;
case IS_NULL:
case IS_FALSE:
*target = '\0';
return SUCCESS;
case IS_TRUE:
*target = '\1';
return SUCCESS;
case IS_DOUBLE:
*target = (char)(int)Z_DVAL_P(needle);
return SUCCESS;
case IS_OBJECT:
*target = (char) zval_get_long(needle);
return SUCCESS;
default:
php_error_docref(NULL, E_WARNING, "needle is not a string or an integer");
return FAILURE;
}
}
/* }}} */

Тот (char) приведение будет выполнено (т.е. будут сохранены только 8 младших значащих битов), что означает, что var_dump(strpos('foo', ord('o') + 256)); даст 1 в качестве ответа, так же, как var_dump(strpos('foo', ord('o')));,

Имейте в виду, что любая из старых функций str * в PHP не Многобайтовое кодирование известно — они работают только с одиночными байтами. Строка в PHP представляет собой набор байтов (а не символов) и вызова strpos приведет к совпадению только одного значения байта. Поэтому, если вы дадите ему строку с многобайтовой кодировкой, ваши результаты не будут иметь большого смысла.

Если вы используете многобайтовую кодировку, такую ​​как utf-8, mbstring Модуль предоставляет копии большинства внутренних строковых функций при обработке многобайтового кодирования. За strpos эта функция называется mb_strpos.

PHP также поддерживает функциональность для переопределения внутренних имен функций с их mb_* коллеги, но это поведение устарело, насколько я помню, и на него нельзя полагаться каким-либо образом, поскольку оно нарушает код невидимыми способами.

2

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

Других решений пока нет …

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