PHP中那些隐蔽的坑

城边编程 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」,使用时非常考验程序员的风险意识和经验储备。下面就是没考虑风险的情况:

$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是世界上最好的语言』

本文分享自微信公众号 - 城边编程(code-log)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏自学的仙叔

Scrapy框架学习---Scrapy介绍(一)

1、Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

7130
来自专栏我得去远方

爬取500双色球彩票

url = "http://kaijiang.500.com/shtml/ssq/"+number+".shtml"

10420
来自专栏一Li小麦

web之攻与受(xss篇)

xss(cross site script,又名跨站脚本攻击,因为和css缩写重叠,故简称叉ss)通常是可解析的内容(html,script)未经处理直接插入到...

10630
来自专栏前端一会

《Node.js权威指南》:转换URL字符串与查询字符串

在HTTP服务中,服务器端可以从客户端请求所用的url中获取很多信息。nodejs中有url模块和queryString模块,分别用来获取完整url字符串中信息...

10830
来自专栏java 微风

springCloud - 第12篇 - 服务监控 Hystrix 面板

前面有用过 Hystrix 熔断,在多服务运行时。可以通过 Hystrix 的监控面板来实时观察各个服务的运行健康、效率和请求量等。

21520
来自专栏PHP专享栏

PHP环境安全加固

随着使用 PHP 环境的用户越来越多,相关的安全问题也变得越来越重要。PHP 环境提供的安全模式是一个非常重要的内嵌安全机制,PHP 安全模式能有效控制一些 P...

11310
来自专栏云原生实验室

云原生周报第 1 期 | 2019-06-24~2019-06-28

云原生不但可以很好的支持互联网应用,也在深刻影响着新的计算架构、新的智能数据应用。以容器、服务网格、微服务、Serverless 为代表的云原生技术,带来一种全...

10630
来自专栏菲宇

django-debug-toolbar安装配置及使用

django-debug-toolbar是一个非常方便的工具,可以深入了解代码的工作以及它花费多少时间。特别是它可以显示你的页面生成的所有SQL查询,以及每个人...

9640
来自专栏前端一会

《Node.js权威指南》:HTTP服务器获取客户端请求信息

上一篇《《Node.js权威指南》:如何创建HTTP服务器》中概括的介绍了创建HTTP服务器的套路,包括创建http服务器对象,用服务器对象监听客户端连接事件、...

12840
来自专栏米奇爱编程

Golang高效实践之泛谈篇

我博客之前的Golang高效实践系列博客中已经系统的介绍了Golang的一些高效实践建议,例如:《Golang高效实践之interface、reflection...

10420

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励