如果 strpos() 函数的 'needle' 参数包含不能用作任何字符的序数值的转换整数值怎么办?
What if the 'needle' parameter of strpos() function contains a converted integer value that can not be applied as the ordinal value of any character?
我在 Windows 10 操作系统运行 上使用 PHP 7.2.8 =30=].
我从 PHP 手册中给出的 description of 'needle' parameter in strpos() function 中看到以下文本:
needle
If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.
从上面关于'needle'参数的说法我不明白'needle'参数时函数strpos();
是怎么工作的strpos() 函数的转换后的整数值不能用作任何字符的序数值。
当 strpos() 函数的 'needle' 参数包含不能用作任何字符的序数值的转换整数值时,有人可以解释手册中声明的实际含义吗?通俗易懂,语言通俗易懂?
如果您能提供几个合适的 strpos()
函数代码示例,其中 strpos() 函数的 'needle' 参数包含转换后的整数值,那对我和其他学习者来说会更好不能用作任何字符的序数值。
谢谢。
任何值(在合理范围内)作为 needle will be converted to char(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 = '[=10=]';
return SUCCESS;
case IS_TRUE:
*target = '';
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)
cast 将环绕(即仅保留 8 个最低有效位),这意味着 var_dump(strpos('foo', ord('o') + 256));
将给出 1 作为答案,与 var_dump(strpos('foo', ord('o')));
相同.
请注意,PHP 中的任何旧 str* 函数都不支持 多字节编码 - 它们仅适用于单个字节。 PHP 中的字符串是字节(而非字符)的集合,调用 strpos
将导致仅匹配单个字节值。所以如果你给它一个多字节编码的字符串,你的结果将没有多大意义。
如果您使用多字节编码,例如 utf-8,mbstring
模块在处理多字节编码时提供大部分内部字符串函数的副本。对于 strpos
that function is named mb_strpos
.
PHP 还支持使用 mb_*
对应项覆盖内部函数名称的功能,但据我所知,该行为已被弃用 - 不应以任何方式依赖,因为它以不明显的方式破坏代码。
我在 Windows 10 操作系统运行 上使用 PHP 7.2.8 =30=].
我从 PHP 手册中给出的 description of 'needle' parameter in strpos() function 中看到以下文本:
needle
If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.
从上面关于'needle'参数的说法我不明白'needle'参数时函数strpos();
是怎么工作的strpos() 函数的转换后的整数值不能用作任何字符的序数值。
当 strpos() 函数的 'needle' 参数包含不能用作任何字符的序数值的转换整数值时,有人可以解释手册中声明的实际含义吗?通俗易懂,语言通俗易懂?
如果您能提供几个合适的 strpos()
函数代码示例,其中 strpos() 函数的 'needle' 参数包含转换后的整数值,那对我和其他学习者来说会更好不能用作任何字符的序数值。
谢谢。
任何值(在合理范围内)作为 needle will be converted to char(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 = '[=10=]';
return SUCCESS;
case IS_TRUE:
*target = '';
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)
cast 将环绕(即仅保留 8 个最低有效位),这意味着 var_dump(strpos('foo', ord('o') + 256));
将给出 1 作为答案,与 var_dump(strpos('foo', ord('o')));
相同.
请注意,PHP 中的任何旧 str* 函数都不支持 多字节编码 - 它们仅适用于单个字节。 PHP 中的字符串是字节(而非字符)的集合,调用 strpos
将导致仅匹配单个字节值。所以如果你给它一个多字节编码的字符串,你的结果将没有多大意义。
如果您使用多字节编码,例如 utf-8,mbstring
模块在处理多字节编码时提供大部分内部字符串函数的副本。对于 strpos
that function is named mb_strpos
.
PHP 还支持使用 mb_*
对应项覆盖内部函数名称的功能,但据我所知,该行为已被弃用 - 不应以任何方式依赖,因为它以不明显的方式破坏代码。