作为 needle 给出的任何值(在合理范围内)都将转换为 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 = '\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')));
.
请注意,PHP 中的任何旧 str* 函数都不支持多字节编码 - 它们仅适用于单字节。PHP 中的字符串是字节(而不是字符)的集合,调用strpos
将导致仅匹配单个字节值。所以如果你给它一个多字节编码的字符串,你的结果将没有多大意义。
如果您使用的是多字节编码,例如 utf-8,则该mbstring
模块在处理多字节编码时提供大多数内部字符串函数的副本。因为strpos
那个函数被命名为mb_strpos
.
PHP 还支持使用其对应项覆盖内部函数名称的功能mb_*
,但据我所知,该行为已被弃用 - 不应以任何方式依赖,因为它会以不明显的方式破坏代码。