前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP中那些隐蔽的坑

PHP中那些隐蔽的坑

作者头像
sibenx
发布2019-09-12 12:44:16
8450
发布2019-09-12 12:44:16
举报
文章被收录于专栏:城边编程

城边编程 phplog

读完需要

5

分钟

速读仅需2分钟

各大论坛中只要是关于PHP的话题最后都会变成引战贴,争来争去就那么几个点在重复的说,最开始我也会去知乎上回答,每次回答完都会遇到杠精来骂你,我又骂不过那些人,最后还是选择佛系点当看客。今天聊点干货,助你在知乎的PHP话题上不落下风。

函数返回参数之坑

通常情况下函数返回的数据类型都是固定的,比如返回Int,String,Array。但是PHP不一样,PHP中很多函数返回的数据类型并不固定。

例如 json_decode($a) 函数,正常情况下这个函数能将字符串转换成数组然后返回,但是少数情况下它会有自己的想法。比如传入`true`会返回`true`,传入`false`会返回`false`,传入`NULL`会返回`NULL`。就像欢乐农场一样种瓜得瓜,种豆得豆。如果你传入的字符串不是标准JSON格式,或者JSON串的层数超过定义的值,又会返回`NULL`。

容易把人绕晕,简单点描述就是正常情况下 json_decode($a) 函数会返回数组,其他情况下会返回`true`,`false`,`NULL`。在使用这个函数时不出问题还好,只要一出问题,没认真看文档的人肯定一脸懵。

这种函数还特别多,PHP manual上给这种返回类型起名叫「mixed」,使用时非常考验程序员的风险意识和经验储备。下面就是没考虑风险的情况:

代码语言:javascript
复制
$pwd="9527"
if (strcmp($_GET['pwd'],$pwd) == 0) {
    return true;
} else {
    return false;
}

strcmp($a,$b) 函数的返回类型也是mixed,正常情况下会返回int,如果传入的是数组,则返回`false`,PHP中 `false` == 0是成立的,所以可以绕过。

json函数之坑

在PHP7.1之后,json_encode($arr) 函数会默认给float类型的数据添加精度。比如数组中有个值是8.6,json_encode 之后会变成8.60000000000001。我遇到时也自我怀疑了半天,好在这个问题可以通过修改配置文件修复,最初该配置是为了让 json_encode($arr) 函数保留更多精度,典型的好心办了坏事,在PHP7.2之后默认关闭了这个功能。只有PHP7.1版本有这个问题。

json_decode($json) 函数我之前有一篇文章分析过,此函数存在hash碰撞漏洞,所有版本都会受到影响,至今未改进。之前的分析文章请看这里-我是如何拿到巨额漏洞奖金的

数组结构类型太少之坑

PHP虽然有数组的概念,但全是基于HashTable实现。你想创建一个int型的数组,但是PHP不支持。你想创建一个sting类型的数组,PHP也不支持。虽然在语法上看起来像是int,string类型的数组,但底层还是HashTable。这导致PHP在算法上优化的空间非常小,更没有办法基于数组扩展更多高级的数据结构,比如双向链表,红黑树等。虽然基于HashTable也能做,但没人会这样去弄,因为效率太低,一定要做的话只能通过C语言开发PHP扩展。

知乎上大家说的那些问题我觉得都不是什么大问题。例如语法不美,速度不快,函数命名不规范……为什么都喜欢喷这几点?我猜测是因为这几点容易解释并且不好反驳,比如说`$`和`->`语法不美,你确实没办法反驳,每个人对美的认知不一样。说速度不快,也有道理,因为无论怎么优化都有比你快的编程语言。最后『PHP是世界上最好的语言』

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 城边编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档