PHP中用下标符号[]去读取字符串的逻辑

Posted lxjshuju

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中用下标符号[]去读取字符串的逻辑相关的知识,希望对你有一定的参考价值。

php [(下标)] 符号不仅能够应用于数组和对象,还能够应用于字符串,假设不注意非常easy出错。

比方获取一个网络接口,正常情况下会返回一个数组结构的json,经过解析之后结果为:

array(
‘content‘ => ‘This is returned by interface‘
)


我们获取到接口数据之后,通过下面语句来推断content是否有值的话,就会有问题:

if (!empty($result[‘content‘]))
    echo $result[‘content‘];

由于可是假设server异常。可能会返回以下的html字符串:

<html>
    <head>
        <title>505</title>
    </head>
    <body>
        Service Internal Error
    </body>
</html>

这样的情况下。经过json_decode解析我们假设使用上面的语句,就会获得一个 < 字符,这是为什么呢?

我们来看一下 PHP5.2.5 中 [] 作用于字符串的逻辑:

.......
        case IS_STRING: {
                zval tmp; 

                if (dim == NULL) {
                    zend_error_noreturn(E_ERROR, "[] operator not supported for strings");
                }    

                if (Z_TYPE_P(dim) != IS_LONG) {
                    switch(Z_TYPE_P(dim)) {
                        /* case IS_LONG: */
                        case IS_STRING:
                        case IS_DOUBLE:
                        case IS_NULL:
                        case IS_BOOL:
                            /* do nothing */
                            break;
                        default:
                            zend_error(E_WARNING, "Illegal offset type");
                            break;
                    }    

                    tmp = *dim;
                    zval_copy_ctor(&tmp);
                    convert_to_long(&tmp);
                    dim = &tmp;
                }    
                switch (type) {
                    case BP_VAR_R:
                    case BP_VAR_IS:
                    case BP_VAR_UNSET:
                        /* do nothing... */
                        break;
                    default:
                        SEPARATE_ZVAL_IF_NOT_REF(container_ptr);
                        break;
                }    
                if (result) {
                    container = *container_ptr;
                    result->str_offset.str = container;
                    PZVAL_LOCK(container);
                    result->str_offset.offset = Z_LVAL_P(dim);
                    result->var.ptr_ptr = NULL;
                    if (type == BP_VAR_R || type == BP_VAR_IS) {
                        AI_USE_PTR(result->var);
                    }    
                }    
                return;
            }    
            break;
......

上面源代码中:dim 表示下标;

首先,推断是不是[]操作符中没有下标。假设是就报错。

由于没有下标的话,是要新增一个字数组,这对于字符串来说肯定要出错。

然后推断下标是不是数字型的,请注意 1234 和 "1234" ,PHP都会觉得是数字型。假设不是数字类型的。就会将下标转换为数字型。这样的转换规则下,字符串都会被转换为0。

所以,上面那个样例中。訪问下标为 content 的数据时。就会返回下标为0的数据,也就是 < 字符。

所以。严谨地来说,訪问一个数组下标的时候,要首先推断一下这个类型是不是数组类型,才干保证万无一失。





以上是关于PHP中用下标符号[]去读取字符串的逻辑的主要内容,如果未能解决你的问题,请参考以下文章

最全LaTeX 数学公式字母符号上下标列表矩阵公式注释分数二进制数分割字符逻辑集合论否定符号等

php向数组添加含有下标的元素

一个由有符号下标引起的bug

华为OD机试 - 单词反转(Python)| 真题含思路

华为OD机试 - 单词反转(JavaScript) | 机试题算法思路 2023

批处理中用for指令从文件读取字符串时如何对字符串进行判断