SG 全稱 Superglobals,它的誕生爲了方便快捷操做PHP預約義的超全局變量,用戶定義的超全局變量。php
若是在非CLI模式,SG默認託管PHP預約義的超全局變量, 包括經常使用 $_GET,$_POST,$_COOOKIE,$_SERVER,$_FILES。git
使用SG類,能讓複雜的代碼變得簡單,開啓自動過濾還能減小代碼量,進而提升咱們的開發效率。github
git clone https://github.com/yulonghu/sg.git
$ /path/to/php/bin/phpize $ ./configure --with-php-config=/path/to/php/bin/php-config $ make && make install
extension=sg.so [sg] sg.enable = On
重啓php進程,就安裝成功啦。數組
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)
sg.enable = On/Off sg.auto_trim = On/Off ; Strip whitespace with PHP trim
傳統的獲取方式 (短) | 新獲取方式 |
---|---|
$_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') |
傳統的獲取方式 (長) | 新獲取方式 |
---|---|
$_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') |
傳統的獲取方式 (isset + trim) | 新獲取方式 |
---|---|
$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'); |
經過以上的整理,能夠得出一個結論,傳統取值方式容易出錯,若是數組維度越深,代碼複雜度會直線上升。app
使用SG,這些狀況都變得很簡單。更新、刪除方式類同。性能
<?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')); // 如下方式不推薦,更新PHP預約義的超全局變量值 var_dump(sg::set('g.key', 'value')); var_dump(sg::set('p.key', 'value')); var_dump(sg::set('c.key', 'value')); var_dump(sg::set('s.key', 'value')); var_dump(sg::set('f.key', 'value'));
以上例子輸出的結果:spa
bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) bool(true)
<?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'));
以上例子輸出的結果:.net
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
<?php var_dump(sg::has('test')); var_dump(sg::has('not_found'));
以上例子輸出的結果:code
bool(true) bool(false)
<?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" } }
演示自動過濾先後空格的例子, 支持兩種方式開啓自動過濾。
爲了得到最佳性能,若是知足trim條件, sg將改變原始值。避免每次取值時重複作trim操做。
<?php 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"
SG is open source software under the PHP License v3.01