я использую PHP 7.2.8 на моей машине, работающей на Операционная система Windows 10.
Я наткнулся на следующий текст из описание параметра ‘needle’ в функции strpos () дано в руководстве по PHP:
игла
Если игла не является строкой, она преобразуется в целое число и применяется в качестве порядкового значения символа.
Из приведенного выше утверждения о «Игла» параметр я не понимаю, как работает функция strpos();
работают, когда параметр ‘needle’ функции strpos () содержит преобразованное целочисленное значение, которое нельзя применять в качестве порядкового значения какого-либо символа.
Может кто-нибудь объяснить, пожалуйста, фактический смысл утверждения из руководства, когда параметр ‘needle’ функции strpos () содержит преобразованное целочисленное значение, которое не может быть применено в качестве порядкового значения какого-либо символа в простой для понимания, простой и понятной язык?
Для меня и других обучающихся было бы лучше, если бы вы могли предоставить пару подходящих примеров рабочего кода: strpos()
функция, где параметр ‘needle’ функции strpos () содержит преобразованное целочисленное значение, которое нельзя применять в качестве порядкового значения какого-либо символа.
Благодарю вас.
Любое значение (в пределах разумного), указанное как игла будет преобразован в символ (тип данных внутри 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_*
коллеги, но это поведение устарело, насколько я помню, и на него нельзя полагаться каким-либо образом, поскольку оно нарушает код невидимыми способами.
Других решений пока нет …