网站编程语言PHP5.6特性回顾

PHP社区的先驱们维护四个版本,几天前多个版本号更新,PHP5.6、7版本号均有向前推进

PHP5.6新特性

1、可用表达式定义常量

2、[重要]可用...运算符定义变长参数函数、展开参数函数

3、使用 ** 进行幂运算

4、对use运算符进行function 和const引入扩展[面向对象]

5、新增一个交互调试器phpdbg

6、对一些字符编码相关函数,适用php.ini的default_charset作为默认字符集

7、可以多次打开读取php://input

8、支持大于2GB文件 上传

9、GMP支持运算符重载

10、使用hash_equals()比较字符串避免时序攻击

11、新增__debugInfo()用于var_dump()输出对象控制输出属性和值[面向对象]

12、加入gost-crypto 散列算法

13、对SSL/TLS的支持大幅度提升

14、pgsql支持异步方式连接数据库及执行查询

函数参数可变运算符

这一版本新增的...运算符可以称作语法糖,让函数变量个数弹性伸缩,更加智慧出现的原因是函数参数个数动态可变,怎么让程序去适应而不是让开发者写很多呆萌分支穷举,例如

这个...运算符很像省略号,个人更喜欢叫做:

伸缩函数操作符、弹性函数操作符

(可以短暂思考一下设计者为什么把操作符放前面...$p,而不是后面$p...

有两种使用情景:

1) 在定义函数时使用,表明函数将自适应接收1到多个参数。这种写法用于改进自定义函数,举个例子:

现在可以这样写

调用对比:

2) 在传入参数时使用,表明该变量将变身为1到多个参数。这种用法可用于增加系统函数调用灵活性,因为系统函数参数个数固定,例如:

求知实验室

还有一种情况,在函数定义和调用都使用...操作符,继续沿用上面的求和函数sum为其打call,我们又要用你举例子

sum函数比刚才更简单少了一行语句

注意:操作符...同时出现在函数定义和调用的情形在实际中并不多见。已经存在的系统函数从未有过申明...参数的写法,而你的自定义函数需要从现在开始创造,所以有时简单并不是实践中最有用的

最佳实践

现在就要实际运用...操作符解决实际问题,我们的目标锁定在mysqli方式操作数据库的插入操作stmt的参数绑定上,让插入更加智能同时不依赖任何MVC框架轻松打造自己的mysqli操作类

现在我们有一个学生信息表student,其中name、school字段是字符类型

在MySQL插入数据的SQL语句写法

在PHP中对应的写法

当这个表增加了两个字段性别$sex(INT)、年级$garde(VARCHAR),那么这个插入语句就要修改,而且你还要去判断哪些字段是字符串,加上'{$变量}',哪些是整型,去掉' '。当大量的工作是操作数据库时,SQL改来改去显得蠢爆了,另外如果这些值来自用户输入,还要过滤这些输入参数防止异常,也许就是——灾难的开端

最终实现插入的效果,不必考虑表结构不依赖任何框架,只要插入数据$data变化则自动匹配字段执行插入

实现这个myDB类思路是用到了MySQL的预处理语句机制和上面所说的PHP弹性操作符函数语法。PHP用mysqli扩展提供的mysqli_stmt类来对接此机制,一条预处理语句

PHP中等价的写法:

这种写法只是解决了一半问题,不用过滤输入参数,但再多传两个参数。小心翼翼的修改了$sql的字段,对应加了?号的个数,修改了绑定类型并且对应参数,这一套操作写下来天啦噜

工作中一个表可能有几十个字段,这个拼接可能要从白天肝到天黑,那么?

借助...操作符 我们立即想到了这样

然后意识到哪里不对,想到的可能是下面的写法

静似大功告成,我们发现一旦$paramList变化,$sql、$typeStr都要跟着改变,另外$paramList变量的顺序影响着$typeStr的顺序,所以有了最终的实现思路结构,由传入参数$data直接影响,只要数据表有对应字段自动匹配插入:

特别注意$paramList最终是数字索引数组:

设计思路

首先我们知道数据库中一个表的字段是有限的,每个字段的类型也认为是固定的,而且每个字段名字是唯一的,同一个表不会有两个字段叫name。向一个表插入数据,先问问这个表有哪些字段,让程序去自动匹配存在的字段拼接语句执行插入。借助预处理语句避免了过滤参数,借助...操作符增加程序弹性变得更加智能

完整的实现类代码将在后面的推送中提供

预处理语句是MySQL提供的功能

MySQL从4.1版本开始提供了一种名为预处理语句(prepared statement)的机制。它可以将整个命令向MySQL服务器发送一次,以后只有参数发生变化,MySQL服务器只需对命令的结构做一次分析就够了。这不仅大大减少了需要传输的数据量,还提高了命令的处理效率。可以用mysqli扩展模式中提供的mysqli_stmt类的对象

肝文章可比写代码更幸苦,尤其是包含技术的文章

欢迎关注留言交流,一个执着于原生PHP的自学人

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180306G1FPS600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券