
语法糖往往给程序员提供了更实用的编码方式,可以使代码更简洁流畅,语义更自然。本文介绍一个简单的 PHP 语法糖扩展,扩展了一种全新的 PHP 超全局变量获取方式。本文来自公众号“360 技术”的投稿,作者范家鹏,360 技术委员会–WEB 服务端分 TC 委员。
说说语法糖
首先说说“语法糖”这个词绝非贬义词,它可以给我们的开发工作带来便利,是一种轻量级便捷的写法,既不会对语言本身的使用造成不利影响,也不会在性能上带来损失。
通常情况下,使用语法糖能够增加程序的可读性,减少程序复杂性,减少编码中出错的机会,也对开发工程师具有友好性,能够提升我们的开发效率。
优秀的语法糖,应该是一种灵魂思想的注入,简单写法的应用。我这里用一幅图来表示:

什么是 SG?
SG 全称 Superglobals,引用全局作用域中可用的全部变量。SG 扩展了一种全新的 PHP 超全局变量获取方式。
这些超全局变量是:_SERVER,_GET,_POST,_FILES,_COOKIE,_SESSION,_REQUEST,_ENV。
当然了,也可以应用到自定义变量场景。
非常重要的一点是:它很简单!
项目背景
这个 idea 出发点很简单,从扩展名称我们应该能猜到它是做什么的。
在性能最优的前提下:
能通俗易懂地简化 HTTP 参数获取方法
需要对 HTTP 参数值进行统一过滤、转换、解密操作
获取 HTTP 参数前,需要进行一些 Predefined Operation
针对 HTTP 参数的一切行为,需要同步更新对应的 PHP Superglobal
声明时才使用,而非请求一开始就对 PHP Superglobals 扫荡式处理
在 global 语法上,扩展一项能获取 HTTP 参数的能力
So,SG 出现就是为了解决上面这些问题而来,它提供了一种更加甜蜜的语法,当前已经发布了 v3.0.0。项目地址。
欢迎大家来提交 Issues~
当前支持的 PHP 版本,如下图所示:

SG 的特性
简单,快速,轻量
零拷贝访问 PHP 超全局变量,使用 SG 会同步更新 PHP 超全局变量
支持取值前调用自定义函数,默认情况下,字符串变量会自动调用 PHP trim
解决使用 PHP 超全局变量时出现未定义系列的问题 (Undefined variable, Undefinedoffset)
采用静态方法时,以小数点代替 PHP 数组维度
采用 global 声明方式时,以下划线代替 PHP 数组维度
支持可配置的 global $variable 查找深度,默认一级查找
配置项(php.ini)

Hash Map

流程图
global 声明方式(PHP7)

函数方式

API
global 声明方式

静态方法

例子
global 声明例子
sg.global_level = 1


以上例子输出的结果:

sg.global_level = 0

以上例子输出的结果:

sg.func_name

以上例子输出的结果:

静态方法例子
get/set/has/del()


以上例子输出的结果:

sg.func_name

以上例子输出的结果:

性能测试
噼里啪啦说了大半天,性能到底怎么样呢?我在本地环境做了一个简单的 ab 测试(ab -c100 -n10000),PHP 测试代码如下:
default - 源码

global 声明方式 - 源码

default - 结果


global 声明方式 - 结果


总结
SG 具有以下优势:
兼容了当前的主流 PHP 版本
提供了一种更加甜蜜的语法,丰富了 Superglobals 的应用
我们始终相信:简单才是王道
注意:global 声明方式,当前只支持不可变变量名。
本文转载自公众号 360 云计算(ID:hulktalk)。
原文链接:
https://mp.weixin.qq.com/s/zb98V_BaFdrd9KB2qf-71g
评论