我居然把这坑给填完了?!

我居然把这坑给填完了?!

创意 3610 字 / 8 分钟

笑话成真了?

还记得我在去年 12 月时介绍了我当时做的个人常用小工具集合——John’s Lab。上面汇集了很多我平时经常要用到的小工具。在文章的末尾,我曾说未来想把她做成一个完整的系统,大家都可以按照一套规则开发自己的小工具,然后再添加到上面来进行管理、运行。

(这就是当时立下的 flag)

确实,这在当时刚学会 CodeIgniter 框架的我看来,确实是难以想象的。但其实高考后,我对 PHP 这门语言也没什么太大的长进,最多就是熟练了不少。结果我便一腔热血地开了这个坑,开始写我这个名字叫做 Cube 的小工具“框架”。

所以这是个什么玩意?

在刚开始做这个 Cube 的时候,我曾跟我爸聊起过这个想法。但是我发现真的很难和别人解释清这个东西到底有什么用。我爸对“框架”的意思不太理解。我向他解释说我所想做的并不是一个系统或者具有太多实际用途的应用,她更像是一个平台,大家把自己做的东西放到这个平台上来集中管理和运行。并且你也可以在自己的服务器上搭建自己的这个“平台”。

反正当时和他这么解释也还是挺晕的。说穿了,说得 low 一点,微信小程序知道吧?我这个东西的作用就是集中管理那些小程序的一个存在,你可以理解为是你进入微信往下拉,然后出来那一堆小程序的那个面板的这么个存在。

这么说来倒是 low 了不少,因为这个比方打得也不恰当。只要能大概明白个意思就行。

难点在哪?

做这个 Cube,其实是有几大需要突破的难点的,我也是因为这几个难题从没接触过,对此十分有兴趣想试试看,所以才做的。

1. 沙箱机制

沙箱,即每个小工具之间要互相分隔开来,互相不能干扰对方的运行,更不能够干扰到 Cube 主程序的运行。那么这就需要对各个小工具所能拥有的权限进行设置。虽说是限制权限,但回归到真实的编码中,那就是禁止小工具调用只有系统才能调用的核心方法与属性。比如直接访问数据库,对数据库进行操作等,这些都是小工具不能直接接触到的。

2. 小工具的管理

因为每个小工具都是独立安装进来的,他们与 Cube 系统的核心代码是独立的,所以要对它们进行统一的管理。比如禁用、启用小工具,删除小工具等操作,这些回归到本质其实就是加载或不加载小工具的代码,或者删除小工具的文件夹。

3. 各种方法与接口

一个小工具,它可能包含多个页面,可能需要存储数据,可能需要判断当前用户的登录状态。这些功能其实都要 Cube 系统留出相应的接口与方法然后让小工具来自行调用的。接口越多,小工具也就可以开发地更强大,能力更多。

怎么解决?

实现沙箱的方法其实有很多。我是十分灵活地使用面向对象,将一些小工具禁用的方法设置为 private。并且得益于 PHP 的一个很特殊的语法——在函数内部若想访问外部的变量,需要先用 global $varible 来申明一个全局变量才可调用。初次看来这确实很反人类,但其实它有意想不到的用处。

因为 Cube 中的一些系统的界面,比如管理员登录、主页、设置等界面,其实也是以小工具的形式加载的。只不过这些小工具属于系统级别的,它们可以调用直接访问并操作数据库的方法,但一般的用户编写的小工具不行。怎样实现这个效果呢?只需要判断一下这是否是系统内置的小工具,如果是的话,就加入 global $db,申明这个数据库的全局变量,那么小工具就可以调用这个数据库类的实例的方法啦~

而关于小工具的管理,这个其实挺好做的。启用、禁用小工具只需要修改数据库中当前已启用的小工具的信息即可。删除的话,也就是调用 PHP 的方法删除文件夹即可。比较有意思的是 URL 路由。也就是将链接显示成:http(s)://你的域名/小工具名称 这种形式。这里我是第一次做,所以参考了 CodeIgniter 框架中的实现方法,它们是获取到当前 URL 后再用正则表达式匹配出相应的字段,然后再去找寻相应的控制器显示界面。

这里就不得不提 PHP 中的一个让我心里和生理上都感觉很爽的存在——可变变量、可变函数。可变变量,是你可以在代码中自定义变量的名字!比如我有一个变量 $a = ‘b’,显然,变量 a 的值是字符串 b。那么如果我写 $$a = ‘c’,这就相当于声明了一个变量 b,然后它的值为字符串 c。也就是说,代码中的变量名,其实是可以通过代码来控制的。可变函数的功能也是类似,$a = ‘b’,$a() 就是调用了方法 b()。这些十分神奇的功能为 URL 路由的实现提供了一种思路。用户可以以 $this->router[‘About’] = ‘show_about_me’;这种形式来注册一个路由,程序可以用可变函数来访问 show_about_me 这个方法。至于二级的路由后面再跟第三级,那不就可以作为这个方法的参数,和 CodeIgniter 里面一样的。

管理小工具中还有获取小工具的基本信息这一块,这里我是直接想到了 WordPress 中的插件。每一个插件的信息都是以 PHP 注释的形式写在主文件的开头,然后系统可以读取。一直觉得这十分的神奇。阅读了 WordPress 的源码,发现这是先获取主文件的代码内容,然后正则表达式匹配出来的。这里我也就直接照搬了,我相信 WordPress 的代码应该是这类问题的最优解了吧。

然后就是怎样给小工具接口呢?这个其实是看起来功能很强大,但实现蛮简单的。不就是将一个方法设置成 public,然后小工具直接就可以调用了嘛。

目前有什么功能了?

目前的进度,我觉得一个小工具所需要的 90% 的基本功能都已经有了。比较有特色的就是小工具可以通过数据库的接口写入读取数据,可以注册路由来实现多个页面。并且在 Cube 中还有管理员登录功能,登录进去后可以管理小工具,甚至还可以删除小工具存储在 Cube 上的数据,并且对 Cube 进行一些设置。

目前有哪些不足呢?

目前我觉得的不足有如下几点:
  1. 一会儿使用面向对象的思想建了个类,一会又直接就声明方法,搞得不同模块间其实还挺乱的。有的需要 $this-> 调用,有的就直接调用。

  2. 代码量方面,前端的 JavaScript 与 CSS 占比太重,导致 GitHub 上面将我这个项目主要语言标记为 JavaScript。(真的是耻辱)

  3. 小工具的沙箱机制还不够完善,并且用户登录等安全方面做得还不够。现在小工具是可以直接读取存储在本地的 Cookies 的。

  4. 也不算是不足吧。小工具的开发其实并不是 MVC 模式,其中并不存在处理数据的 Model(模型)层,直接就是在 Controller(控制器)层中全部干完了。

  5. 在本地上运行的速度还挺快的,不知为何放到服务器上就变慢了,打开控制台,发现静态资源加载的都挺快的,那问题就出在 PHP 运行的太慢了??我这点东西服务器难道还要运算半天??

感想

讲真,Cube 是我到目前为止写得最大,最复杂的 PHP 项目了。很难想象我居然把它写出来了!这应该也就代表着其实我也可以写出一个简单的 PHP 开发框架来了?真是不敢想啊。期间阅读了 CodeIgniter 和 WordPress 的源代码,我是将它们的解决方法当做标准来看待的,毕竟有无数的大佬 Pull Request 过,上面的方法应该就是最佳的解决办法了。所以我在想,如果我能有心读完 WordPress 的全部源码(睡觉时把枕头垫高点,做个好梦),然后把 WordPress 差不多摸透了,我也是挺想给它提交 Pull Request 的,那就有的吹了,我可是为全互联网上将近 30% 的网站贡献过代码的之类的。(醒醒!)实在是太喜欢这个软件了。

并且,因为我是 Cube 的开发者,所以我对其所有的接口和方法都十分熟悉。自己在给 Cube 写小工具时那真的是爽,各种功能信手沾来。由此我能想象的到,腾讯那些开发微信小程序的人,自己写个微信小程序也是说不出的爽。成为规则的制定者,很舒服。

从某种意义上来说,Cube 可能真的是我迄今为止,唯一一个开了坑然后认真把它填完了的。以前都是突然有了个点子就开始做,做到中途就会因为什么原因便暂时放下了,之后就不了了之了。但这次我居然是真的做完了!!很开心啊!为了奖励自己,这几天我都跑到楼下去买奶茶喝,哈哈。

接下来?

那么,这个 Cube 的开发应该也就告一段落了,因为核心功能已经完成了。以后也就是修修补补,加一些新功能了。我也想好了接下来一段时间要做的东西,难度自然是比 Cube 还大。因为之前做过几个微信小程序的项目,我的想法是开发一个不需要写代码就可以轻松使用的微信小程序后端,一切都是图形界面点来点去就好。相当于是将微信小程序后端这一个部分给简化了。也还是用 PHP 写。所涉及到的方面也是我之前未接触过的。我在想如果这个做成了,我以后,甚至很多人以后,开发微信小程序时也就不会那么心塞了吧。可以将更多地时间投入到前端界面的交互处理上去了。

未来想做的事

这个项目估计也得到大学里慢慢去完成了,我今后 GitHub 上面每天的 contribution 也要靠她了。(真实目的暴露了,坚持每天写代码就是为了 GitHub 那一片小绿点)期间还要花时间去搞阿里云的学生认证,域名拍照备案。尽早搞定那个数字杭电系统,搞到学生邮箱,开通 GitHub 教育优惠。对了,还要抽空去学 iOS Swift 开发,Swift 4 相关的书籍我预计是在 11 月份左右会出版。然后到了十一月份嘛,还要省吃俭用存下钱去预定 SAO 第三季爱丽丝的手办。然后 Mili 又要来上海开演唱会,我还想存(tao)钱(ke)坐高铁去看。

总之,等着我去做的事还很多,我也知道肯定也存在着很多不好的事。(因为最近就被一些事搞得戾气很重——树莓派貌似被玩坏了,然后垃圾手机又是各种空间不足……)嘛,不提了不提了。顺其自然吧。