摘要:本文介紹筆者自己寫的語(yǔ)法糖擴(kuò)展,擴(kuò)展了一種全新的超全局變量獲取方式。優(yōu)秀的語(yǔ)法糖,應(yīng)該是一種靈魂思想的注入,簡(jiǎn)單寫法的應(yīng)用。非常重要的一點(diǎn)是它很簡(jiǎn)單項(xiàng)目背景這個(gè)出發(fā)點(diǎn)很簡(jiǎn)單,從擴(kuò)展名稱我們應(yīng)該能猜到它是做什么的。
奇技指南1、說(shuō)說(shuō)語(yǔ)法糖
語(yǔ)法糖往往給程序員提供了更實(shí)用的編碼方式,可以使代碼更簡(jiǎn)潔流暢,語(yǔ)義更自然。本文介紹筆者自己寫的PHP語(yǔ)法糖擴(kuò)展,擴(kuò)展了一種全新的PHP超全局變量獲取方式。
本文作者范家鵬,360技術(shù)委員會(huì)--WEB服務(wù)端分TC委員。
首先說(shuō)說(shuō)“語(yǔ)法糖”這個(gè)詞絕非貶義詞,它可以給我們的開(kāi)發(fā)工作帶來(lái)便利,是一種輕量級(jí)便捷的寫法,既不會(huì)對(duì)語(yǔ)言本身的使用造成不利影響,也不會(huì)在性能上帶來(lái)?yè)p失。
通常情況下,使用語(yǔ)法糖能夠增加程序的可讀性,減少程序復(fù)雜性,減少編碼中出錯(cuò)的機(jī)會(huì),也對(duì)開(kāi)發(fā)工程師具有友好性,能夠提升我們的開(kāi)發(fā)效率。?
優(yōu)秀的語(yǔ)法糖,應(yīng)該是一種靈魂思想的注入,簡(jiǎn)單寫法的應(yīng)用。我這里用一幅圖來(lái)表示:
2、什么是SG?SG?全稱 Superglobals,引用全局作用域中可用的全部變量。SG擴(kuò)展了一種全新的PHP超全局變量獲取方式。?
這些超全局變量是:_SERVER,_GET,_POST,_FILES,_COOKIE,_SESSION,_REQUEST,_ENV。?
當(dāng)然了,也可以應(yīng)用到自定義變量場(chǎng)景。
非常重要的一點(diǎn)是:它很簡(jiǎn)單!
2.1 項(xiàng)目背景這個(gè)idea出發(fā)點(diǎn)很簡(jiǎn)單,從擴(kuò)展名稱我們應(yīng)該能猜到它是做什么的。
在性能最優(yōu)的前提下:?
能通俗易懂地簡(jiǎn)化HTTP參數(shù)獲取方法
需要對(duì)HTTP參數(shù)值進(jìn)行統(tǒng)一過(guò)濾、轉(zhuǎn)換、解密操作
獲取HTTP參數(shù)前,需要進(jìn)行一些Predefined Operation
針對(duì)HTTP參數(shù)的一切行為,需要同步更新對(duì)應(yīng)的PHP Superglobal
聲明時(shí)才使用,而非請(qǐng)求一開(kāi)始就對(duì)PHP Superglobals掃蕩式處理
在global語(yǔ)法上,擴(kuò)展一項(xiàng)能獲取HTTP參數(shù)的能力
So,SG出現(xiàn)就是為了解決上面這些問(wèn)題而來(lái),它提供了一種更加甜蜜的語(yǔ)法,當(dāng)前已經(jīng)發(fā)布了v3.0.0。
2.2 項(xiàng)目地址https://github.com/yulonghu/sg?
歡迎大家來(lái)提交Issues~
當(dāng)前支持的PHP版本,如下圖所示:
3、SG的特性簡(jiǎn)單,快速,輕量?
零拷貝訪問(wèn)PHP超全局變量,使用SG會(huì)同步更新PHP超全局變量?
支持取值前調(diào)用自定義函數(shù),默認(rèn)情況下,字符串變量會(huì)自動(dòng)調(diào)用 PHP trim?
解決使用PHP超全局變量時(shí)出現(xiàn)未定義系列的問(wèn)題 (Undefined variable, Undefinedoffset)?
采用靜態(tài)方法時(shí),以小數(shù)點(diǎn)代替PHP數(shù)組維度?
采用global聲明方式時(shí),以下劃線代替PHP數(shù)組維度
支持可配置的global $variable查找深度,默認(rèn)一級(jí)查找
4、配置項(xiàng)(php.ini)配置項(xiàng) | 權(quán)限 | 類型 | 默認(rèn)值 | 說(shuō)明 |
---|---|---|---|---|
sg.enable | PHP_INI_SYSTEM | bool | 0 | 0 關(guān)閉 1 開(kāi)啟 |
sg.global_level | PHP_INI_SYSTEM | bool | 1 | 1 只支持一級(jí)查找 0 無(wú)限制查找 |
sg.func_name | PHP_INI_ALL | char | trim | 默認(rèn)調(diào)用 PHP trim 函數(shù),也支持自定義函數(shù) |
PHP 超全局變量 | SG key (關(guān)鍵字縮寫) | global 聲明 | 函數(shù) |
---|---|---|---|
$GLOBALS | 無(wú) | 無(wú) | 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 靜態(tài)方法
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
以上例子輸出的結(jié)果:
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以上例子輸出的結(jié)果:
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以上例子輸出的結(jié)果:
string(8) "A Banana"8.2 靜態(tài)方法例子 8.2.1 get/set/has/del()以上例子輸出的結(jié)果:
------------------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以上例子輸出的結(jié)果:
string(8) "A Banana"9、性能測(cè)試噼里啪啦說(shuō)了大半天,性能到底怎么樣呢?我在本地環(huán)境做了一個(gè)簡(jiǎn)單的ab測(cè)試(ab -c100 -n10000),PHP測(cè)試代碼如下:
9.1 default - 源碼9.2 global 聲明方式 - 源碼ab 測(cè)試的結(jié)果如下:
9.3 default - 結(jié)果$ 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 聲明方式 - 結(jié)果$ 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、總? 結(jié)SG具有以下優(yōu)勢(shì):
兼容了當(dāng)前的主流PHP版本?
提供了一種更加甜蜜的語(yǔ)法,豐富了Superglobals的應(yīng)用
我們始終相信:簡(jiǎn)單才是王道
注意:global 聲明方式,當(dāng)前只支持不可變變量名。
(360技術(shù)原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)務(wù)必保留文末二維碼,謝謝~)
關(guān)于360技術(shù)
360技術(shù)是360技術(shù)團(tuán)隊(duì)打造的技術(shù)分享公眾號(hào),每天推送技術(shù)干貨內(nèi)容
更多技術(shù)信息歡迎關(guān)注“360技術(shù)”微信公眾號(hào)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31689.html
摘要:介紹全稱,它的誕生為了方便快捷操作預(yù)定義的超全局變量,用戶定義的超全局變量。為了獲得最佳性能,如果滿足條件將改變?cè)贾怠? 介紹 SG 全稱 Superglobals,它的誕生為了方便快捷操作PHP預(yù)定義的超全局變量,用戶定義的超全局變量。 如果在非CLI模式,SG默認(rèn)托管PHP預(yù)定義的超全局變量, 包括常用 $_GET,$_POST,$_COOOKIE,$_SERVER,$_FILES...
摘要:和進(jìn)程的啟動(dòng)過(guò)程類似,啟動(dòng)過(guò)程有種進(jìn)程角色啟動(dòng)進(jìn)程進(jìn)程和進(jìn)程。直到請(qǐng)求到來(lái),將連接賦值給對(duì)象的字段。注當(dāng)進(jìn)程執(zhí)行完后會(huì)再次調(diào)用函數(shù),準(zhǔn)備監(jiān)聽(tīng)新的請(qǐng)求。當(dāng)讀取到的時(shí),會(huì)調(diào)用函數(shù)對(duì)進(jìn)行解析,將中的以及存儲(chǔ)到結(jié)構(gòu)體中。 運(yùn)營(yíng)研發(fā)團(tuán)隊(duì) 季偉濱 一、前言 前幾天的工作中,需要通過(guò)curl做一次接口測(cè)試。讓我意外的是,通過(guò)$_POST竟然無(wú)法獲取到Content-Type是application...
摘要:快速入門教程,此教程包括使用的組件。的核心是能夠使用簡(jiǎn)單的模板語(yǔ)法以聲明方式將數(shù)據(jù)呈現(xiàn)給。到目前為止,它看起來(lái)并沒(méi)有太大的不同。如果我們點(diǎn)擊下拉菜單,我們會(huì)得到兩個(gè)選擇或。在下拉菜單中選擇不同的選項(xiàng),上面的文本也將相應(yīng)的發(fā)生變化。 Vue快速入門教程,此教程包括使用Kendo UI for Vue的組件。希望通過(guò)此教程能夠成為你學(xué)習(xí)vue的一個(gè)很好的起點(diǎn)。這其中還包含一個(gè)可擴(kuò)展的事例,...
摘要:快速入門教程,此教程包括使用的組件。的核心是能夠使用簡(jiǎn)單的模板語(yǔ)法以聲明方式將數(shù)據(jù)呈現(xiàn)給。到目前為止,它看起來(lái)并沒(méi)有太大的不同。如果我們點(diǎn)擊下拉菜單,我們會(huì)得到兩個(gè)選擇或。在下拉菜單中選擇不同的選項(xiàng),上面的文本也將相應(yīng)的發(fā)生變化。 Vue快速入門教程,此教程包括使用Kendo UI for Vue的組件。希望通過(guò)此教程能夠成為你學(xué)習(xí)vue的一個(gè)很好的起點(diǎn)。這其中還包含一個(gè)可擴(kuò)展的事例,...
摘要:快速入門教程,此教程包括使用的組件。的核心是能夠使用簡(jiǎn)單的模板語(yǔ)法以聲明方式將數(shù)據(jù)呈現(xiàn)給。到目前為止,它看起來(lái)并沒(méi)有太大的不同。如果我們點(diǎn)擊下拉菜單,我們會(huì)得到兩個(gè)選擇或。在下拉菜單中選擇不同的選項(xiàng),上面的文本也將相應(yīng)的發(fā)生變化。 Vue快速入門教程,此教程包括使用Kendo UI for Vue的組件。希望通過(guò)此教程能夠成為你學(xué)習(xí)vue的一個(gè)很好的起點(diǎn)。這其中還包含一個(gè)可擴(kuò)展的事例,...
閱讀 2662·2021-11-25 09:43
閱讀 2472·2021-09-22 15:29
閱讀 984·2021-09-22 15:17
閱讀 3628·2021-09-03 10:36
閱讀 2223·2019-08-30 13:54
閱讀 1740·2019-08-30 11:23
閱讀 1163·2019-08-29 16:58
閱讀 1290·2019-08-29 16:14