我在运行 Windows 10操作系统的计算机上使用的是 PHP 7.2.8 。
我从PHP手册中的description of 'needle' parameter in strpos() function中看到了以下文本:
针头
如果 needle 不是字符串,则会将其转换为整数并用作字符的序数值。
根据上述有关'needle'参数的陈述,我不明白当strpos()函数的'needle'参数包含转换后的整数时,函数strpos();
的工作原理值不能用作任何字符的序数值。
当strpos()函数的'needle'参数包含一个转换后的整数值时,有人可以从手册中解释该语句的实际含义吗,该值不能以易于理解的方式用作任何字符的序数值,简单明了的语言?
如果您可以提供strpos()
函数的几个合适的工作代码示例,其中strpos()函数的'needle'参数包含不能转换的整数值,这对我和其他学习者会更好用作任何字符的序数值。
谢谢。
答案 0 :(得分:2)
作为指针will be converted to char给出的任何值(在合理范围内)(在C中内部的数据类型,大小为1个字节)。当前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')));
相同。 / p>
请注意,PHP中的任何旧str *函数都不支持多字节编码-它们仅适用于单个字节。 PHP中的字符串是字节(不是字符)的集合,调用strpos
将导致仅单个字节值被匹配。因此,如果给它一个多字节编码的字符串,那么结果将没有多大意义。
如果您使用的是多字节编码,例如utf-8,则mbstring
模块会在处理多字节编码时提供大多数内部字符串函数的副本。对于strpos
that function is named mb_strpos
。
PHP还支持使用其mb_*
对应项覆盖内部函数名称的功能,但是据我所知,该行为已被弃用-不应以任何方式依赖,因为它会破坏非明显的方式。