PHP中 [(下标)] 符号不仅可以应用于数组和对象,还可以应用于字符串,如果不注意很容易出错。
比如获取一个网络接口,正常情况下会返回一个数组结构的json,经过解析之后结果为:
array('content' => 'This is returned by interface')
if (!empty($result['content'])) echo $result['content'];
因为但是如果服务器异常,可能会返回下面的HTML字符串:
505 Service Internal Error
这种情况下,经过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的数据,也就是
所以,严谨地来说,访问一个数组下标的时候,要首先判断一下这个类型是不是数组类型,才能保证万无一失。