32

SG :一个简单的PHP语法糖扩展

 4 years ago
source link: https://www.tuicool.com/articles/6ruQRjb
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

奇技指南

语法糖往往给程序员提供了更实用的编码方式,可以使代码更简洁流畅,语义更自然。本文介绍笔者自己写的PHP语法糖扩展,扩展了一种全新的PHP超全局变量获取方式。

本文作者范家鹏,360技术委员会--WEB服务端分TC委员。

说说语法糖

首先说说“ 语法糖 ”这个词绝非贬义词,它可以给我们的开发工作带来便利,是一种轻量级便捷的写法,既不会对语言本身的使用造成不利影响,也不会在性能上带来损失。

通常情况下,使用语法糖能够增加程序的可读性,减少程序复杂性,减少编码中出错的机会,也对开发工程师具有友好性,能够提升我们的开发效率。

优秀的语法糖,应该是一种灵魂思想的注入,简单写法的应用。我这里用一幅图来表示:

ryE7Rjb.jpg!web

什么是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。

项目地址

https://github.com/yulonghu/sg 

欢迎大家来提交Issues~

当前支持的PHP版本,如下图所示:

baiu2ei.png!web

SG的特性

  • 简单,快速,轻量

  • 零拷贝访问PHP超全局变量,使用SG会同步更新PHP超全局变量

  • 支持取值前调用自定义函数,默认情况下,字符串变量会自动调用 PHP trim

  • 解决使用PHP超全局变量时出现未定义系列的问题 (Undefined variable, Undefinedoffset)

  • 采用静态方法时,以小数点代替PHP数组维度

  • 采用global声明方式时,以下划线代替PHP数组维度

  • 支持可配置的global $variable查找深度,默认一级查找

配置项(php.ini)

6jYBjyI.png!web

Hash Map

3IVzauU.jpg!web

流程图

global 声明方式(PHP7)

VbMnEvf.jpg!web

函数方式

uy2MNvJ.png!web

API

global 声明方式

mY3EJnI.png!web

静态方法

yYNNNjf.png!web

例子

global 声明例子

sg.global_level = 1

m2eMbqq.png!web

fiQrYjZ.png!web

以上例子输出的结果:

BzQ3muV.png!web

sg.global_level = 0

rqiyYvB.png!web

以上例子输出的结果:

m6Zjmqv.png!web

sg.func_name

nqYBb2Y.png!web

以上例子输出的结果:

bYFBnme.png!web

静态方法例子

get/set/has/del()

M7F7bqF.jpg!web

Aj2EruR.png!web

以上例子输出的结果:

q2I36zj.png!web

sg.func_name

mue6N3j.png!web

以上例子输出的结果:

vEVFZ3R.png!web

性能测试

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

default - 源码

MjqQfav.png!web

global 声明方式 - 源码

2iMJZjn.png!web

default - 结果

n2eeA36.png!web

bMFFRn2.jpg!web

global 声明方式 - 结果

IrYnUbi.jpg!web

总  结 

SG 具有以下优势:

  • 兼容了当前的主流PHP版本

  • 提供了一种更加甜蜜的语法,丰富了Superglobals的应用

  • 我们始终相信:简单才是王道

注意:global 声明方式,当前只支持不可变变量名。

IV3myiN.jpg!web

喜欢记得关注鸭~

界世的你当不

只做你的肩膀

7JjiYbn.jpg!web

VFzQnq3.jpg!web

360官方技术公众号 

技术干货|一手资讯|精彩活动

空·

VbYBFb2.gif

点击“阅读原文”查看项目详情

右边给我一朵小花花

VbYBFb2.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK