如果strpos()函数的'needle'参数包含一个转换后的整数值,该值不能用作任何字符的序数值怎么办?

时间:2018-08-22 14:27:57

标签: php string strpos string-search ordinals

我在运行 Windows 10操作系统的计算机上使用的是 PHP 7.2.8

我从PHP手册中的description of 'needle' parameter in strpos() function中看到了以下文本:

  

针头
  如果 needle 不是字符串,则会将其转换为整数并用作字符的序数值。

根据上述有关'needle'参数的陈述,我不明白当strpos()函数的'needle'参数包含转换后的整数时,函数strpos();的工作原理值不能用作任何字符的序数值。

当strpos()函数的'needle'参数包含一个转换后的整数值时,有人可以从手册中解释该语句的实际含义吗,该值不能以易于理解的方式用作任何字符的序数值,简单明了的语言?

如果您可以提供strpos()函数的几个合适的工作代码示例,其中strpos()函数的'needle'参数包含不能转换的整数值,这对我和其他学习者会更好用作任何字符的序数值。

谢谢。

1 个答案:

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