前几天看了下代码,还没深入研究,感觉有的地方还是比较传统,没有用到多少现代化的PHP,也没有严格遵循PSR规范,没有采用现代潮流的 namespace 和 composer ,命名空间也没有。
举例:
就说一个小点。Biny演示页面 上的文档
getParam($key, $default) 获取GET/POST参数{$key}, 默认值为{$default}
getGet($key, $default) 获取GET参数{$key}, 默认值为{$default}
getPost($key,$default) 获取POST参数{$key}, 默认值为{$default}
getJson($key, $default) 如果传递过来的参数为完整json流可使用该方法获取
这组 API 体现了不少问题。
-
第一,getGet 这种无法吐槽的命名。
-
第二,param 在不少框架里指的是 /test/{param}/ 这种形式的路由参数。
-
第三,getGet/getPost 所体现的 get/post 参数这种称呼是错误的。实质上那是 url 上的 query 和
request body 里按照 application/x-www-form-urlencoded 编码的参数。跟请求的 method
是 GET 还是 POST(或者其他)并无关系。GET 请求固然只能有所谓 GET 参数,但 POST 请求就既可以有所谓 POST
参数,又可以有 GET 参数,更不要说 PUT 请求之类的。有人或许会说这是遵循 PHP 的惯例。确实,这也是 PHP的古老而独有的槽点之一,但是既然是做框架,没有必要沿袭错误设计。(当然坚持错误不改,也算是 PHP 的惯例。) -
第四,getJson 这个方法的签名令人困惑。JSON 可以是单一的值,所以不确定这个 k e y 参 数 指 什 么 。 有 人 也 许 会 理 解 为 提 供 了 等 价 于 d e c o d e J S O N ( g e t P a r a m ( key 参数指什么。有人也许会理解为提供了等价于 decodeJSON(getParam( key参数指什么。有人也许会理解为提供了等价于decodeJSON(getParam(key, $default)) 的快捷方法。看了源码之后才知道其实就是假设 JSON是一个对象,取对象上的属性。固然用 JSON 传参数通常都是包装成一个对象,但是 API设计上应注意避免引入未言明的假设,或者至少要把文档写清楚。
-
第五,getParam这种模糊方式(随便是如何得来的参数)是历史遗迹,存在安全隐患。现代框架不应该提供。(另外这个文档和实际代码是不一致的。)
上面这些问题说大不大,说小不小,其实很多自制框架都可能犯这些错误。
坦率的说,我公司从事微信开发有六年历史。所以我们的项目大多都是直接用 laravel 之类的。倒不是说 laravel 一定有多好,但是总体上拥抱社区比自己闭门造车好。另一方面,我们的自制框架也在慢慢改进,没法改的部分也至少是要在代码或文档里写清楚是历史遗迹。总之,我们是不好意思把不良设计开源出来去误导别人的。
最后,推荐一个我们公司目前的开源项目,小程序+公众号商城,项目是全开源的:【查看演示】