奇技指南
语法糖每每给程序员提供了更实用的编码方式,可使代码更简洁流畅,语义更天然。本文介绍笔者本身写的PHP语法糖扩展,扩展了一种全新的PHP超全局变量获取方式。
本文做者范家鹏,360技术委员会--WEB服务端分TC委员。
首先说说“语法糖”这个词绝非贬义词,它能够给咱们的开发工做带来便利,是一种轻量级便捷的写法,既不会对语言自己的使用形成不利影响,也不会在性能上带来损失。php
一般状况下,使用语法糖可以增长程序的可读性,减小程序复杂性,减小编码中出错的机会,也对开发工程师具备友好性,可以提高咱们的开发效率。 git
优秀的语法糖,应该是一种灵魂思想的注入,简单写法的应用。我这里用一幅图来表示:程序员
SG 全称 Superglobals,引用全局做用域中可用的所有变量。SG扩展了一种全新的PHP超全局变量获取方式。 github
这些超全局变量是:_SERVER,_GET,_POST,_FILES,_COOKIE,_SESSION,_REQUEST,_ENV。 shell
固然了,也能够应用到自定义变量场景。数组
很是重要的一点是:它很简单!微信
这个idea出发点很简单,从扩展名称咱们应该能猜到它是作什么的。ide
在性能最优的前提下: 函数
So,SG出现就是为了解决上面这些问题而来,它提供了一种更加甜蜜的语法,当前已经发布了v3.0.0。性能
https://github.com/yulonghu/sg
欢迎你们来提交Issues~
当前支持的PHP版本,以下图所示:
配置项 | 权限 | 类型 | 默认值 | 说明 |
---|---|---|---|---|
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_key
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)
<?php $_GET['key'] = 'GET_test_key'; function testGlobal() { global $g_key; var_dump($g_key); $g_key = 'NEW_GET_test_key'; } testGlobal(); var_dump(sg::get('g.key')); var_dump($GLOBALS['g_key']); var_dump($g_key); var_dump($_GET['key']);
以上例子输出的结果:
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"
<?php $_GET['key']['key1']['key2'] = 'GET_test_key'; function testGlobal() { global $g_key_key1_key2; } testGlobal(); var_dump(sg::get('g.key.key1.key2')); var_dump($GLOBALS['g_key_key1_key2']); var_dump($g_key_key1_key2); var_dump($_GET['key']['key1']['key2']);
以上例子输出的结果:
string(12) "GET_test_key" string(12) "GET_test_key" string(12) "GET_test_key" string(12) "GET_test_key"
<?php ini_set('sg.func_name', 'decryptTest'); $_POST['key'] = 'IEEgQmFuYW5hIA=='; function decryptTest($data) { return trim(base64_decode($data)); } global $p_key; var_dump($p_key);
以上例子输出的结果:
string(8) "A Banana"
<?php $key = 'test'; $val = 'A Banana'; echo "------------------start\n"; var_dump(sg::get($key)); var_dump(sg::get($key, 'def')); var_dump(sg::has($key)); echo "------------------set\n"; var_dump(sg::set($key, $val)); echo "------------------get\n"; var_dump(sg::get($key)); var_dump(sg::get($key, 'def')); var_dump(sg::has($key)); echo "------------------del\n"; var_dump(sg::del($key)); echo "------------------get\n"; var_dump(sg::get($key)); var_dump(sg::has($key));
以上例子输出的结果:
------------------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)
<?php ini_set('sg.func_name', 'decryptTest'); function decryptTest($data) { return trim(base64_decode($data)); } function encryptTest($data) { return base64_encode(trim($data)); } sg::set('user', encryptTest(' A Banana ')); var_dump(sg::get('user'));
以上例子输出的结果:
string(8) "A Banana"
噼里啪啦说了大半天,性能到底怎么样呢?我在本地环境作了一个简单的ab测试(ab -c100 -n10000),PHP测试代码以下:
<?php /* default.php */ for($i = 0; $i < 1000; $i++) { if(isset($_GET['key'])) { var_dump(trim($_GET['key'])); } }
<?php /* sg.php */ for($i = 0; $i < 1000; $i++) { global $g_key; var_dump($g_key); }
ab 测试的结果以下:
$ ab -c100 -n10000 localhost/default.php?key=hello_world
Concurrency 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] received
$ ab -c100 -n10000 localhost/sg.php?key=hello_world
Concurrency 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] received
SG具备如下优点:
注意:global 声明方式,当前只支持不可变变量名。
(360技术原创内容,转载请务必保留文末二维码,谢谢~)
关于360技术
360技术是360技术团队打造的技术分享公众号,天天推送技术干货内容
更多技术信息欢迎关注“360技术”微信公众号