0

我在运行Windows 10 Operating System的机器上使用PHP 7.2.8

我从PHP 手册中给出的strpos() 函数中的“needle”参数的描述中看到以下文本:

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

从上面关于“needle”参数的陈述中,我不明白strpos();当 strpos() 函数的“needle”参数包含一个不能用作任何字符的序数值的转换整数值时,该函数是如何工作的。

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

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

谢谢你。

4

1 回答 1

2

作为 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_*,但据我所知,该行为已被弃用 - 不应以任何方式依赖,因为它会以不明显的方式破坏代码。

于 2018-08-22T21:45:08.227 回答