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

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

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

array(

'content' => 'This is returned by interface'

)

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值