SG :一個簡單的PHP語法糖擴展
語法糖往往給程序員提供了更實用的編碼方式,可以使代碼更簡潔流暢,語義更自然。本文介紹筆者自己寫的PHP語法糖擴展,擴展了一種全新的PHP超全局變量獲取方式。
說說語法糖
首先說說“語法糖”這個詞絕非貶義詞,它可以給我們的開發工作帶來便利,是一種輕量級便捷的寫法,既不會對語言本身的使用造成不利影響,也不會在性能上帶來損失。
通常情況下,使用語法糖能夠增加程序的可讀性,減少程序復雜性,減少編碼中出錯的機會,也對開發工程師具有友好性,能夠提升我們的開發效率。
優秀的語法糖,應該是一種靈魂思想的注入,簡單寫法的應用。我這里用一幅圖來表示:
什么是SG?
SG 全稱 Superglobals,引用全局作用域中可用的全部變量。SG擴展了一種全新的PHP超全局變量獲取方式。
這些超全局變量是:_SERVER,_GET,_POST,_FILES,_COOKIE,_SESSION,_REQUEST,_ENV。
當然了,也可以應用到自定義變量場景。
非常重要的一點是:它很簡單!
1. 項目背景
這個idea出發點很簡單,從擴展名稱我們應該能猜到它是做什么的。
在性能***的前提下:
- 能通俗易懂地簡化HTTP參數獲取方法
- 需要對HTTP參數值進行統一過濾、轉換、解密操作
- 獲取HTTP參數前,需要進行一些Predefined Operation
- 針對HTTP參數的一切行為,需要同步更新對應的PHP Superglobal
- 聲明時才使用,而非請求一開始就對PHP Superglobals掃蕩式處理
- 在global語法上,擴展一項能獲取HTTP參數的能力
So,SG出現就是為了解決上面這些問題而來,它提供了一種更加甜蜜的語法,當前已經發布了v3.0.0。
2. 項目地址
https://github.com/yulonghu/sg
歡迎大家來提交Issues~
當前支持的PHP版本,如下圖所示:
SG的特性
- 簡單,快速,輕量
- 零拷貝訪問PHP超全局變量,使用SG會同步更新PHP超全局變量
- 支持取值前調用自定義函數,默認情況下,字符串變量會自動調用 PHP trim
- 解決使用PHP超全局變量時出現未定義系列的問題 (Undefined variable, Undefinedoffset)
- 采用靜態方法時,以小數點代替PHP數組維度
- 采用global聲明方式時,以下劃線代替PHP數組維度
- 支持可配置的global $variable查找深度,默認一級查找
配置項(php.ini)
Hash Map
流程圖
global 聲明方式(PHP7):
函數方式
API
global 聲明方式:
靜態方法
例子
1. global 聲明例子
(1) sg.global_level = 1:
以上例子輸出的結果:
(2) sg.global_level = 0
以上例子輸出的結果:
(3) sg.func_name
以上例子輸出的結果:
2. 靜態方法例子
(1) get/set/has/del()
以上例子輸出的結果:
(2) sg.func_name
以上例子輸出的結果:
性能測試
噼里啪啦說了大半天,性能到底怎么樣呢?我在本地環境做了一個簡單的ab測試(ab -c100 -n10000),PHP測試代碼如下:
default - 源碼:
global 聲明方式 - 源碼:
default - 結果:
global 聲明方式 - 結果:
總結
SG具有以下優勢:
- 兼容了當前的主流PHP版本
- 提供了一種更加甜蜜的語法,豐富了Superglobals的應用
- 我們始終相信:簡單才是王道
注意:global 聲明方式,當前只支持不可變變量名。
【本文是51CTO專欄機構360技術的原創文章,微信公眾號“360技術( id: qihoo_tech)”】