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中用下标符号[]去读取字符串的逻辑的更多相关文章
- C# 按不同的字节编码,通过字节数去截取字符串
/// <summary> /// 按不同的字节编码,通过字节数去截取字符串 /// 数据库UTF-8 1个数字.字母.英文符号算1个长度 1个中文.中文符号算3个长度 /// </ ...
- 关于C中scanf()函数读取字符串的问题
#include <stdio.h> int main(void) { ]; scanf("%s", s_name); printf("Hello, %s!\ ...
- Git文件常见下标符号说明
Git文件常见下标符号说明 git是一种分布式的版本控制工具. 不用联网也能实现版本控制,很实用. 它是一款现在比较流行的版本控制工具. git的文件上的图标,可以反映出当前文件或者文件夹的状 ...
- 使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python中是否有单独的字符类型,通过下标的方式表示字符串中的字符
说明: 在python中,没有单独的字符类型,一个字符呢就是一个大小为1的字符串. 并且可以通过下标的方式,表示字符串中的字符. 操作过程: 1.通过[ ]的方式表示字符串中的第几个字符 >&g ...
- 如何使用App.config文件,读取字符串?
如何使用App.config文件,读取字符串? .在项目里添加App.config文件,内容如下: <?xml version="1.0" encoding="ut ...
- java保存json格式数据,保存字符串和读取字符串
1.java保存json格式数据,保存字符串和读取字符串 import java.io.*; class RWJson { public void wiite(String s, String toS ...
- 使用Properties去读取配置文件,并获得具体内容值
有时候,写了一个配置文件,需要知道读出来的内容对不对,我们需要测试一下,看看读出来的跟我们要的是不是一样.这里写了一个工具类,用来读取配置文件里面的内容. 一.使用Properties工具类来读取. ...
- 指针*pbuffer和getchar 读取字符串
在C语言入门教材里看到这一段代码,没看懂是什么意思.char buffer[10];char *pbuffer = buffer;while( (*pbuffer++ = getchar() )!= ...
随机推荐
- redis配置外部访问
iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT 开放6379端口
- mysqli数据库操作简单实例
mysqli数据库操作简单实例 代码 结果
- 【转】使用Docker+Jenkins自动构建部署
转载自 https://segmentfault.com/a/1190000012921606 环境 阿里云ESC,宿主机服务器安装Docker,在安全规则中确认8080端口开启. 客户端mac 运行 ...
- 解决:[WARNING] fpm_children_bury(), line 215: child 2736 (pool default) exited on signal 15 SIGTERM after 59.588363 seconds from start
试用Nginx + PHP FastCGI 做WEB服务器,运行了几个月的时间,烦恼的是经常碰到Nginx 502 Bad Gateway 这个问题. 参考了很多修改办法,这个502的问题一直存在,今 ...
- PHP-输入账号密码进入网页
1. 2. 3. 4.(itcast.html步骤)随便一个本地网页代替即可
- github踩坑之git命令收集与整理(windows)
最近开始又捡起git,第一家公司用的就是git,一直掌握的也不深刻,就知道常用的几个命令,虽然现在用svn,但是觉得git还是不能丢,遂又捡起来了.先总结一部分目前练习用到的,慢慢填补吧~ githu ...
- runloop源代码
https://github.com/zzf073/runloopDemo /** * 调度例程 * 当将输入源安装到run loop后,调用这个协调调度例程,将源注册到客户端(可以理解为其他线程 ...
- 手机上最简洁的"云笔记"软件
❗️注意:该文并不是真的给你介绍各类云笔记的对比 第三方云笔记的缺点 以前用MIUI和Flyme时,自带的记事本很好用,小巧简洁,路上想起什么就写下来,回去后登录网上的个人中心,拿出来加工一下就可以发 ...
- 为什么密信MeSince采用S/MIME加密?
S/MIME是Secure/Multipurpose Internet Mail Extensions (安全多用途互联网邮件扩展协议)的缩写,是采用PKI技术的用数字证书给邮件主题签名和加密的国标标 ...
- NuSOAP笔记:如何创建复杂数据类型
PHP已经有了内置的SOAP扩展,但是它不具备自动生成WSDL的能力,所以很多时候,NuSOAP还是有一定诱惑力的. 在应用稍微复杂点的时候,单靠integer, string等简单数据类型是不能满足 ...