如果 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_* 对应项覆盖内部函数名称的功能,但据我所知,该行为已被弃用 - 不应以任何方式依赖,因为它以不明显的方式破坏代码。