摘要:本文介绍笔者自己写的语法糖扩展,扩展了一种全新的超全局变量获取方式。优秀的语法糖,应该是一种灵魂思想的注入,简单写法的应用。非常重要的一点是它很简单项目背景这个出发点很简单,从扩展名称我们应该能猜到它是做什么的。
奇技指南1、说说语法糖
语法糖往往给程序员提供了更实用的编码方式,可以使代码更简洁流畅,语义更自然。本文介绍笔者自己写的PHP语法糖扩展,扩展了一种全新的PHP超全局变量获取方式。
本文作者范家鹏,360技术委员会--WEB服务端分TC委员。
首先说说“语法糖”这个词绝非贬义词,它可以给我们的开发工作带来便利,是一种轻量级便捷的写法,既不会对语言本身的使用造成不利影响,也不会在性能上带来损失。
通常情况下,使用语法糖能够增加程序的可读性,减少程序复杂性,减少编码中出错的机会,也对开发工程师具有友好性,能够提升我们的开发效率。
优秀的语法糖,应该是一种灵魂思想的注入,简单写法的应用。我这里用一幅图来表示:
2、什么是SG?SG 全称 Superglobals,引用全局作用域中可用的全部变量。SG扩展了一种全新的PHP超全局变量获取方式。
这些超全局变量是:_SERVER,_GET,_POST,_FILES,_COOKIE,_SESSION,_REQUEST,_ENV。
当然了,也可以应用到自定义变量场景。
非常重要的一点是:它很简单!
2.1 项目背景这个idea出发点很简单,从扩展名称我们应该能猜到它是做什么的。
在性能最优的前提下:
能通俗易懂地简化HTTP参数获取方法
需要对HTTP参数值进行统一过滤、转换、解密操作
获取HTTP参数前,需要进行一些Predefined Operation
针对HTTP参数的一切行为,需要同步更新对应的PHP Superglobal
声明时才使用,而非请求一开始就对PHP Superglobals扫荡式处理
在global语法上,扩展一项能获取HTTP参数的能力
So,SG出现就是为了解决上面这些问题而来,它提供了一种更加甜蜜的语法,当前已经发布了v3.0.0。
2.2 项目地址https://github.com/yulonghu/sg
欢迎大家来提交Issues~
当前支持的PHP版本,如下图所示:
3、SG的特性简单,快速,轻量
零拷贝访问PHP超全局变量,使用SG会同步更新PHP超全局变量
支持取值前调用自定义函数,默认情况下,字符串变量会自动调用 PHP trim
解决使用PHP超全局变量时出现未定义系列的问题 (Undefined variable, Undefinedoffset)
采用静态方法时,以小数点代替PHP数组维度
采用global声明方式时,以下划线代替PHP数组维度
支持可配置的global $variable查找深度,默认一级查找
4、配置项(php.ini)配置项 | 权限 | 类型 | 默认值 | 说明 |
---|---|---|---|---|
sg.enable | PHP_INI_SYSTEM | bool | 0 | 0 关闭 1 开启 |
sg.global_level | PHP_INI_SYSTEM | bool | 1 | 1 只支持一级查找 0 无限制查找 |
sg.func_name | PHP_INI_ALL | char | trim | 默认调用 PHP trim 函数,也支持自定义函数 |
PHP 超全局变量 | SG key (关键字缩写) | global 声明 | 函数 |
---|---|---|---|
$GLOBALS | 无 | 无 | sg::all() |
$_SERVER | s | global $s | sg::get/set/has/del("s") |
$_GET | g | global $g | sg::get/set/has/del("g") |
$_POST | p | global $p | sg::get/set/has/del("p") |
$_FILES | f | global $f | sg::get/set/has/del("f") |
$_COOKIE | c | global $c | sg::get/set/has/del("c") |
$_SESSION | n | global $n | sg::get/set/has/del("n") |
$_REQUEST | r | global $r | sg::get/set/has/del("r") |
$_ENV | e | global $e | sg::get/set/has/del("e") |
global $g_key, $p_key, $c_key, $s_key, $f_key, $n_key, $e_key, $r_key7.2 静态方法
bool sg::set(string $key, mixed $value) mixed sg::get(string $key [, mixed $default_value = null]) bool sg::has(string $key) bool sg::del(string $key [, mixed $... ]) array sg::all(void)8、例子 8.1 global 声明例子 8.1.1 sg.global_level = 1
以上例子输出的结果:
string(12) "GET_test_key" string(16) "NEW_GET_test_key" string(16) "NEW_GET_test_key" string(16) "NEW_GET_test_key" string(16) "NEW_GET_test_key"8.1.2 sg.global_level = 0以上例子输出的结果:
string(12) "GET_test_key" string(12) "GET_test_key" string(12) "GET_test_key" string(12) "GET_test_key"8.1.3 sg.func_name以上例子输出的结果:
string(8) "A Banana"8.2 静态方法例子 8.2.1 get/set/has/del()以上例子输出的结果:
------------------start NULL string(3) "def" bool(false) ------------------set bool(true) ------------------get string(8) "A banana" string(8) "A banana" bool(true) ------------------del bool(true) ------------------get NULL bool(false)8.2.2 sg.func_name以上例子输出的结果:
string(8) "A Banana"9、性能测试噼里啪啦说了大半天,性能到底怎么样呢?我在本地环境做了一个简单的ab测试(ab -c100 -n10000),PHP测试代码如下:
9.1 default - 源码9.2 global 声明方式 - 源码ab 测试的结果如下:
9.3 default - 结果$ ab -c100 -n10000 localhost/default.php?key=hello_worldConcurrency Level: 100 Time taken for tests: 1.615 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 251370000 bytes HTML transferred: 250000000 bytes Requests per second: 6190.21 [#/sec] (mean) Time per request: 16.155 [ms] (mean) Time per request: 0.162 [ms] (mean, across all concurrent requests) Transfer rate: 151956.36 [Kbytes/sec] received9.4 global 声明方式 - 结果$ ab -c100 -n10000 localhost/sg.php?key=hello_worldConcurrency Level: 100 Time taken for tests: 1.441 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 251931544 bytes HTML transferred: 250557708 bytes Requests per second: 6938.67 [#/sec] (mean) Time per request: 14.412 [ms] (mean) Time per request: 0.144 [ms] (mean, across all concurrent requests) Transfer rate: 170709.87 [Kbytes/sec] received10、总 结SG具有以下优势:
兼容了当前的主流PHP版本
提供了一种更加甜蜜的语法,丰富了Superglobals的应用
我们始终相信:简单才是王道
注意:global 声明方式,当前只支持不可变变量名。
(360技术原创内容,转载请务必保留文末二维码,谢谢~)
关于360技术
360技术是360技术团队打造的技术分享公众号,每天推送技术干货内容
更多技术信息欢迎关注“360技术”微信公众号
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/31689.html
摘要:介绍全称,它的诞生为了方便快捷操作预定义的超全局变量,用户定义的超全局变量。为了获得最佳性能,如果满足条件将改变原始值。 介绍 SG 全称 Superglobals,它的诞生为了方便快捷操作PHP预定义的超全局变量,用户定义的超全局变量。 如果在非CLI模式,SG默认托管PHP预定义的超全局变量, 包括常用 $_GET,$_POST,$_COOOKIE,$_SERVER,$_FILES...
摘要:和进程的启动过程类似,启动过程有种进程角色启动进程进程和进程。直到请求到来,将连接赋值给对象的字段。注当进程执行完后会再次调用函数,准备监听新的请求。当读取到的时,会调用函数对进行解析,将中的以及存储到结构体中。 运营研发团队 季伟滨 一、前言 前几天的工作中,需要通过curl做一次接口测试。让我意外的是,通过$_POST竟然无法获取到Content-Type是application...
摘要:快速入门教程,此教程包括使用的组件。的核心是能够使用简单的模板语法以声明方式将数据呈现给。到目前为止,它看起来并没有太大的不同。如果我们点击下拉菜单,我们会得到两个选择或。在下拉菜单中选择不同的选项,上面的文本也将相应的发生变化。 Vue快速入门教程,此教程包括使用Kendo UI for Vue的组件。希望通过此教程能够成为你学习vue的一个很好的起点。这其中还包含一个可扩展的事例,...
摘要:快速入门教程,此教程包括使用的组件。的核心是能够使用简单的模板语法以声明方式将数据呈现给。到目前为止,它看起来并没有太大的不同。如果我们点击下拉菜单,我们会得到两个选择或。在下拉菜单中选择不同的选项,上面的文本也将相应的发生变化。 Vue快速入门教程,此教程包括使用Kendo UI for Vue的组件。希望通过此教程能够成为你学习vue的一个很好的起点。这其中还包含一个可扩展的事例,...
摘要:快速入门教程,此教程包括使用的组件。的核心是能够使用简单的模板语法以声明方式将数据呈现给。到目前为止,它看起来并没有太大的不同。如果我们点击下拉菜单,我们会得到两个选择或。在下拉菜单中选择不同的选项,上面的文本也将相应的发生变化。 Vue快速入门教程,此教程包括使用Kendo UI for Vue的组件。希望通过此教程能够成为你学习vue的一个很好的起点。这其中还包含一个可扩展的事例,...
阅读 2662·2021-11-25 09:43
阅读 2471·2021-09-22 15:29
阅读 983·2021-09-22 15:17
阅读 3627·2021-09-03 10:36
阅读 2222·2019-08-30 13:54
阅读 1739·2019-08-30 11:23
阅读 1162·2019-08-29 16:58
阅读 1290·2019-08-29 16:14