我读Discuz代码的一些收获
这段时间因为要用到Discuz论坛,粗略读了一下代码,就有一些收获,和大家共享:
1、模块化跳转:
之前我习惯用require或者include之类指令把PHP文件包含进来,在调用文件中访问新php文件的类或者方法,而发现Discuz几乎全部是用require之类指令包含进这个文件,在新文件中直接有处理代码,相当于goto到新文件过去,用$_G[]之类的全局变量来传输参数,确实不错,使跳转很清晰。
而且,在require_once跳转的时候,把php部分文件名作为变量来处理,例如require_once libfile('home/'.$mod, 'module'),这样就相当方便了,利用action指令来跳转不同的模块。
2、模板化
论坛本身是大量动态化内容,需要和数据库频繁交互,访问量大时,很容易卡。Discuz用了模板的概念,简单的说就是用php生成html页面,这个html页面就php根据template来生成的,template其实就是html中定义了标签和简单语法(例如循环之类),用户请求php页面时,php根据设定的缓冲超时时间,来确定是直接读取之前生成的html返回给用户,还是重新从数据库请求生成新的Html内容并返回给用户。而且在用户写入数据的时候,例如发贴或者回帖时,会通知刷新html缓冲,从而即使缓冲没有超时,也能刷新。
这样能解决动态数据和静态化的问题,而且还能让逻辑和界面分离,更好的分工,淘宝店铺之类应该也是类似原理了。而且对于很多网站有大量重复的地方,例如界面开头和结尾,就可以用子模板header.html和footer.html的模板来描述,在php生成的时候包含进去就可以了。整个结构就优雅很多了。
3、小技巧
1)之前我用字段数据生成sql语句时,例如字段:表t中,a=1,b=2,要生成update,update t set a=1, b=2。用数组生成的时候,我一直的用法是"a=1,b=2,",然后去掉最后那个",",而下面代码就优雅很多,其实就是换一种思维,“空a=1",然后是”,b=2",不看别人源码,很容易陷入固定思维,尤其是像我比较懒的。
- function implode_field_value($array, $glue = ',') {
- $sql = $comma = '';
- foreach ($array as $k => $v) {
- $sql .= $comma."`$k`='$v'";
- $comma = $glue;
- }
- return $sql;
- }
2)Discuz的class_core.php文件中,封装了一个DB类,其中的单例用法很特别:
- function &object($dbclass = 'db_mysql') {
- static $db;
- if(empty($db)) $db = new $dbclass();
- return $db;
- }
用了一个object搞定了一般getInstance之类的,用起来简洁很多,而且用单例节省了一些mysql connect。一开始我对其这个类里没有平常mysql close之类的地方,感到很奇怪,竟然没有关闭连接,查了资料才发现,其实php的mysql连接其实没有必要关闭,在脚本结束的时候,会自动关闭的,这样在代码中写的时候就方便很多,例如每个中途return的时候,就无需写close之类的代码。
3)密码安全:
Discuz的密码md5的时候,用了一个salt的概念,其实就是md5(md5($password).$salt)
这样有一个好处,就是如果黑客获取到数据库的username和password,至少不能用md5($password)比对已有结果的方式猜测一下密码。
posted on 2017-07-15 23:45 alleyonine 阅读(215) 评论(0) 编辑 收藏 举报