Home > Backend Development > PHP Tutorial > PHP中用下标符号[]去读取字符串的逻辑

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

WBOY
Release: 2016-06-23 13:48:20
Original
1366 people have browsed it

PHP中 [(下标)] 符号不仅可以应用于数组和对象,还可以应用于字符串,如果不注意很容易出错。

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

array('content' => 'This is returned by interface')
Copy after login


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

if (!empty($result['content']))    echo $result['content'];
Copy after login

因为但是如果服务器异常,可能会返回下面的HTML字符串:

            <title>505</title>                Service Internal Error    
Copy after login

这种情况下,经过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;......
Copy after login

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

首先,判断是不是[]操作符中没有下标,如果是就报错。因为没有下标的话,是要新增一个字数组,这对于字符串来说肯定要出错。

然后判断下标是不是数字型的,请注意 1234 和 "1234" ,PHP都会认为是数字型。如果不是数字类型的,就会将下标转换为数字型,这种转换规则下,字符串都会被转换为0;

所以,上面那个例子中,访问下标为 content 的数据时,就会返回下标为0的数据,也就是

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

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template