写点什么

SG :一个简单的 PHP 语法糖扩展

  • 2019-11-18
  • 本文字数:1276 字

    阅读完需:约 4 分钟

SG :一个简单的PHP语法糖扩展

语法糖往往给程序员提供了更实用的编码方式,可以使代码更简洁流畅,语义更自然。本文介绍一个简单的 PHP 语法糖扩展,扩展了一种全新的 PHP 超全局变量获取方式。本文来自公众号“360 技术”的投稿,作者范家鹏,360 技术委员会–WEB 服务端分 TC 委员。

说说语法糖

首先说说“语法糖”这个词绝非贬义词,它可以给我们的开发工作带来便利,是一种轻量级便捷的写法,既不会对语言本身的使用造成不利影响,也不会在性能上带来损失。


通常情况下,使用语法糖能够增加程序的可读性,减少程序复杂性,减少编码中出错的机会,也对开发工程师具有友好性,能够提升我们的开发效率。


优秀的语法糖,应该是一种灵魂思想的注入,简单写法的应用。我这里用一幅图来表示:


什么是 SG?

SG 全称 Superglobals,引用全局作用域中可用的全部变量。SG 扩展了一种全新的 PHP 超全局变量获取方式。


这些超全局变量是:_SERVER,_GET,_POST,_FILES,_COOKIE,_SESSION,_REQUEST,_ENV。


当然了,也可以应用到自定义变量场景。


非常重要的一点是:它很简单!

项目背景

这个 idea 出发点很简单,从扩展名称我们应该能猜到它是做什么的。


在性能最优的前提下:


  • 能通俗易懂地简化 HTTP 参数获取方法

  • 需要对 HTTP 参数值进行统一过滤、转换、解密操作

  • 获取 HTTP 参数前,需要进行一些 Predefined Operation

  • 针对 HTTP 参数的一切行为,需要同步更新对应的 PHP Superglobal

  • 声明时才使用,而非请求一开始就对 PHP Superglobals 扫荡式处理

  • 在 global 语法上,扩展一项能获取 HTTP 参数的能力


So,SG 出现就是为了解决上面这些问题而来,它提供了一种更加甜蜜的语法,当前已经发布了 v3.0.0。项目地址


欢迎大家来提交 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 声明方式

静态方法

例子

global 声明例子

sg.global_level = 1



以上例子输出的结果:


sg.global_level = 0


以上例子输出的结果:


sg.func_name


以上例子输出的结果:


静态方法例子

get/set/has/del()



以上例子输出的结果:


sg.func_name


以上例子输出的结果:


性能测试

噼里啪啦说了大半天,性能到底怎么样呢?我在本地环境做了一个简单的 ab 测试(ab -c100 -n10000),PHP 测试代码如下:

default - 源码

global 声明方式 - 源码

default - 结果


global 声明方式 - 结果


总结

SG 具有以下优势:


  • 兼容了当前的主流 PHP 版本

  • 提供了一种更加甜蜜的语法,丰富了 Superglobals 的应用

  • 我们始终相信:简单才是王道


注意:global 声明方式,当前只支持不可变变量名。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/zb98V_BaFdrd9KB2qf-71g


2019-11-18 13:531104

评论

发布
暂无评论
发现更多内容

Flink SQL 如何实现列转行?

JasonLee实时计算

flink

我的Java转Go之路

roseduan

Java 转行 Go web Go 语言

多应用集中落地,四川区块链产业爆发增长

CECBC

区块链

Vue3源码 | 深入理解响应式系统下篇-effect

梁龙先森

源码分析 大前端 Vue3

「架构师训练营 4 期」 第十周 - 001&2

凯迪

架构师训练营 4 期

安全架构学习总结

跳蚤

MySQL调优

Sakura

28天写作 3月日更

React 中 useContext 和 useMemo 一般性使用

sadhu

React useContext useMemo React Hooks

区块链+版权:NFT出圈,善用技术能否“破心中贼”?

CECBC

数字技术

「架构师训练营 4 期」 第十一周 - 001&2

凯迪

架构师训练营 4 期

区块链+金融落地应用详解

CECBC

金融

架构师是什么?

ES_her0

28天写作 3月日更

【得物技术】前端微服务

得物技术

微服务 大前端 得物技术

第十一周作业

MR.X

【笔记】第七周 第 2 课

Geek_娴子

数据采集之Flume采集及点击流模型详解

五分钟学大数据

大数据 28天写作 3月日更 flume 点击流模型

又一款Nginx 管理可视化神器!通过界面完成配置监控,一条龙!

Java小咖秀

nginx 运维 后端

还原五百丁APP需求文档

林亚超

net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader found for source data.

wjchenge

散列表-hashTable

x-arts

散列函数

基于 SparkMLlib 智能课堂教学评价系统-系统设计(三)

大数据技术指南

大数据 spark 智能时代 28天写作 3月日更

Elasticsearch 写入流程 Making Changes Persistent

escray

elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 3月日更

简述软件不可用性及解决办法

跳蚤

员工遇到问题 - 是给答案还是给引导?

石云升

项目管理 28天写作 职场经验 管理经验 3月日更

我的学习笔记

SilentMacUser

Python JavaScript 学习 大前端 开发

英文IT数码类播客学习笔记

SilentMacUser

红帽 互联网 播客 计算机历史

雄岸科技区块链布局价值待考

CECBC

区块链 科技

场景化面试:Kafka 为何有如此高的吞吐量和性能

面试官问

kafka 零拷贝 PageCache

张开怀抱迎接Golang

Kylin

读书笔记 语法 3月日更 Java转go Go 语言

人社部拟发10几个新职业,区块链行业占两个

CECBC

区块链人才

操作系统的内存管理(上)

Arvin

内存管理

  • 扫码加入 InfoQ 开发者交流群
SG :一个简单的PHP语法糖扩展_文化 & 方法_范家鹏_InfoQ精选文章