我读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)比对已有结果的方式猜测一下密码。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值