2011年4月25日星期一

Discuz! X1.5 二次开发-源代码分析(class_core.php)

class discuz_core:首先是声明一些属性,比如配置,session,DB资源等。

&instance,首先是static $object,if(empty($object)),使其在整个脚本中只实例化一个discuz_core。在实际脚本中只要直接调用类中的这个方法就可以实例化了,比如$discuz = &discuz_core::instance();

discuz_core(),构造函数,调用四个方法,完成对环境,配置,输入输出的初始化。

init(),如果没有完成初始化,则调用一些方法,完成对数据库,缓存,用户,session,配置,计划任务等的初始化。

_init_env(), 完成魔法引用,常用常用常量,时区,引入函数库,把GLOBALS中的GET,POST等在属性中不被允许的值从GLOBALS中注销,调用机器人阻止, 初始化$_G数据,这个变量里放入了这个脚本中几乎所有的配置,常用量等各种信息,有兴趣大家去print_r($_G),并把$_G赋值给属性var。

_init_input(),伪静态参数传入,去反斜杠,把POST,GET数组合并并传入var,其中标记为gp_$k为键名_init_config(),配置文件中传值给$_G_init_output(),地址栏数据过滤,各种缓存,是否强制输出某字符集编码格式reject_robot(),阻击机器人

_get_client_ip(),获取客户端ip_init_db(),实例化数据库并连接返回资源给db_init_session(), 实例化,赋值给$session,利用用户的sid,ip,uid创建一个类似SESSIONID的随机码送到数据库session表,并赋值给var。 discuz中是不用session的,而是利用数据库保存登陆信息,这样据说对于高流量网站是很有利的。然后检测cookie中的值是否匹配,不对的话 就注销,设置了一个isnew属性强制更新。如果此次登陆比上次超过十分钟,则把此次事件当做上次最后登陆时间。更新用户状态表。

_init_user(),对登陆用户进行处理,从cookie中获取信息判断用户是否正确,正确的话,给用户赋值一些常量。否则调用游客配置方法,赋值为游客信息。把这些信息写入全局变量里。

_init_guest() ,给游客赋值。

_init_cron() ,计划任务运行。

_init_misc(),处理表单提交的FORMHASH,风格,各模块的用户权限判断,论坛关闭,tpp话题每页数目,PPP帖子每页数目等

_init_setting(),配置信息赋值给cachelist数据等。

_init_memory(),各种缓存方法。

timezone_set($timeoffset = 0),时区

error($msg, $halt = true),错误时默认中断,写入log

error_log($message),把错误信息写入文件。

class db_mysql,这是数据库类,放到这个文件,不能不说是一个好方法呀。。。

db_mysql($config = array()),构造函数,配置。

set_config($config) 配置赋值。 connect($serverid = 1),还是赋值,这里可以选择多个数据库中的某一个,并区分

_dbconnect($dbhost, $dbuser, $dbpw, $dbcharset, $dbname, $pconnect) ,链接,返回链接句柄。

table_name($tablename),根据某个确定的数据库返回表和表前缀。

select_db($dbname),选择数据库。里面的方法大多和mysql函数相同,还多了fetch_first($sql),返回第一个数组,result_first($sql)返回第一个值,这样的方法。

halt($message = '', $sql = ''),中断数据库操作并退出脚本执行,返回错误信息。

class DB,这个类和上面的类相比很重复哈,这个类是可以直接方便执行语句的。

&object(),这里实例化上面类,一个页面只实例化一个。返回链接句柄。一般用的多。

table($table),这里主要是调用上面类的那个方法,给表赋予前缀,返回表名。其实有一个重大作用,$a = & DB::object();在这里实例化了,所以在这个类下面的几乎所有方法中都使用了这个方法,不仅返回表名而且实例化可以直接用了。

delete($table, $condition, $limit = 0, $unbuffered = true),简洁化操作这个delete,操作时,直接调用DB中这个方法就可以执行删除了,比如DB::delete(),类似的还有 insert,update,这里的insert操作使用的也是set "" = ""的句式,原因和下面这个方法有关。

implode_field_value($array, $glue = ','),这个传入数组,输出语句,就是某某等于某某的语句,可以直接用的。下面的方法和上面一个类大同小异,这样处理的目的就是为了可以在页面直接调 用,无论什么时候,直接调用DB中某个方法。其实这些方法又都是调用上个类中的方法,但是上面的类没有把每个方法单独封装,所以不能直接用。

class discuz_session ,这个类基本是传入sid,ip,uid,然后经过处理保存到session表中,因为加入了ip的信息,所以比session的办法要安全多了,这样ADSL断了一下,后台就需要重新的登陆了哈。。。。这个里面有一个方法,

onlinecount($type = 0),用来统计在线人数,很方便吧。。。

class discuz_cron,计划任务,打开一个页面执行一个操作,数据库里建立有列表的。

class discuz_process,对过程处理,比如在计划任务中,两人同时打开页面,会锁定某一个执行进程,不会出错。

class discuz_memory,各种缓存方式