• 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的数据,也就是 < 字符。

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

  • 相关阅读:
    【Repost】Comparision of B-Tree and LSM Tree
    字符串经典算法 Knuth-Morris-Pratt Boyer-Moore AC(Aho-Corasick)算法 后缀自动机
    【Leetcode 913】【Hard】Cat and Mouse 博弈论
    【转】初探计算机视觉的三个源头、兼谈人工智能
    MySQL--06(索引)
    MySQL--05(子查询&视图)
    MySQL--04(聚合函数&表连接查询)
    MySQL--03(增删改查&主键)
    MySQL--02
    MySQL--01
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7044860.html
Copyright © 2020-2023  润新知