superglobals:PHP预定义的超全局变量管理扩展

2019年4月1日20:22:15 发表评论 765 views

SG 全称 Superglobals,它的诞生为了方便快捷操作PHP预定义的超全局变量,用户定义的超全局变量。

如果在非CLI模式,SG默认托管PHP预定义的超全局变量, 包括$_GET, $_POST, $_COOOKIE, $_SERVER, $_FILES。

使用SG类,能让复杂的代码变得简单,开启自动过滤还能减少代码量,进而提高我们的开发效率。

亮点功能

  • 简单,快速,轻量
  • 零拷贝访问全局变量
  • 支持自动过滤前后空格PHP trim
  • 解决操作PHP全局变量时出现未定义系列的问题 (Undefined variable, Undefined offset)

安装

PHP版本支持包括

  • PHP 5.4 +
  • PHP 7.0 +

下载源码

git clone https://github.com/yulonghu/sg.git
复制代码

Linux系统,编译SG扩展

$ /path/to/php/bin/phpize
$ ./configure --with-php-config=/path/to/php/bin/php-config
$ make && make install
复制代码

php.ini,添加、开启扩展

extension=sg.so

[sg]
sg.enable = On复制代码

重启php-fpm,就安装成功啦。

提供的方法

mixed sg::get(string $key [, mixed $default_value = null])
bool sg::set(string $key, mixed $value)
bool sg::has(string $key)
bool sg::del(string $key)复制代码

支持的INI配置项

sg.enable = On/Off
sg.auto_trim = On/Off ; Strip whitespace with PHP trim复制代码

详细例子

获取PHP预定义的超全局变量

OLD GET METHOD (Short)NEW GET METHOD
$_GET['key']sg::get('g.key')
$_POST['key']sg::get('p.key')
$_COOKIE['key']sg::get('c.key')
$_SERVER['key']sg::get('s.key')
$_FILES['key']sg::get('f.key')
OLD GET METHOD (Long)NEW GET METHOD
$_GET['key']['key1']['key2']sg::get('g.key.key1.key2')
$_POST['key']['key1']['key2']sg::get('p.key.key1.key2')
$_COOKIE['key']['key1']['key2']sg::get('c.key.key1.key2')
$_SERVER['key']['key1']['key2']sg::get('s.key.key1.key2')
$_FILES['key']['key1']['key2']sg::get('f.key.key1.key2')
OLD GET METHOD (isset + trim)NEW GET METHOD
$key = isset($_GET['key']) ? trim($_GET['key']) : null;$key = sg::get('g.key');
$key = isset($_POST['key']) ? trim($_POST['key']) : null;$key = sg::get('p.key');
$key = isset($_COOKIE['key']) ? trim($_COOKIE['key']) : null;$key = sg::get('c.key');
$key = isset($_SERVER['key']) ? trim($_SERVER['key']) : null;$key = sg::get('s.key');
$key = isset($_FILES['key']) ? trim($_FILES['key']) : null;$key = sg::get('f.key');
(PHP7) 传统的获取方式 (??)新获取方式
$key = $_GET['key'] ?? null; $key = trim($key);$key = sg::get('g.key');
$key = $_POST['key'] ?? null; $key = trim($key);$key = sg::get('p.key');
$key = $_COOKIE['key'] ?? null; $key = trim($key);$key = sg::get('c.key');
$key = $_SERVER['key'] ?? null; $key = trim($key);$key = sg::get('s.key');
$key = $_FILES['key'] ?? null; $key = trim($key);$key = sg::get('f.key');

通过以上的整理,可以得出一个结论,传统取值方式容易出错,如果数组维度越深,代码复杂度会直线上升。

使用SG,这些情况都变得很简单。更新、删除方式类同。

设置超全局变量

sg::set

<?php
var_dump(sg::set('test', 'test apple'));
var_dump(sg::set('user.0.0', 'user 0 apple'));
var_dump(sg::set('user.0.1', 'user 1 apple'));
var_dump(sg::set('user.a.a', 'user a apple'));
var_dump(sg::set('user.a.b', 'user b apple'));复制代码

以上例子输出的结果:

bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
复制代码

sg::get

<?php
var_dump(sg::get('test', 'test apple'));
var_dump(sg::get('user');
var_dump(sg::get('not_found', 'def');
var_dump(sg::get('user.1.2.3.4'));复制代码

以上例子输出的结果:

string(10) "test apple"
array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(12) "user 0 apple"
    [1]=>
    string(12) "user 1 apple"
  }
  ["a"]=>
  array(2) {
    ["a"]=>
    string(12) "user a apple"
    ["b"]=>
    string(12) "user b apple"
  }
}
string(3) "def"
NULL
复制代码

sg::has

<?php
var_dump(sg::has('test'));
var_dump(sg::has('not_found'));复制代码

以上例子输出的结果:

bool(true)
bool(false)
复制代码

sg::del

<?php
var_dump(sg::del('test'));
var_dump(sg::del('user.0.1'));
var_dump(sg::get('user');复制代码

以上例子输出的结果:

bool(true)
bool(true)
array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(12) "user 0 apple"
  }
  ["a"]=>
  array(2) {
    ["a"]=>
    string(12) "user a apple"
    ["b"]=>
    string(12) "user b apple"
  }
}
复制代码

sg.auto_trim

演示自动过滤前后空格的例子, 两种方式开启自动过滤。

<?php
// sg.auto_trim = On ; php.ini
ini_set('sg.auto_trim', 1);
function One() {
    var_dump(sg::set('test', ' test apple ')); // Auto-call PHP trim
}
function Two() {
    var_dump(sg::get('test'));
}复制代码

以上例子输出的结果:

bool(true)
string(10) "test apple"

作者:fanjiapeng
链接:https://juejin.im/post/5c9edcb56fb9a05e505c4359
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: