关于discuz X3.2中$discuz->var['mod']的理解
发布:smiling 来源: PHP粉丝网 添加日期:2015-09-30 11:14:25 浏览: 评论:0
在member.php中有这么一段代码:
- $mod = !in_array($discuz->var['mod'], $modarray) && (!preg_match('/^\w+$/', $discuz->var['mod']) || !file_exists(DISCUZ_ROOT.'./source/module/member/member_'.$discuz->var['mod'].'.php')) ? 'register' : $discuz->var['mod'];
从上面的红色部分我们可以看出,这是一个3元运算,好了说重点:$discuz->var['mod']
首先从结构(->)上我们可以看出这是一个类的对象,但具体又是什么呢?我们来看$discuz,在member.php中有如下代码:
- require './source/class/class_core.php';//引入class_core.php
- $discuz = C::app();//调用类C中的app方法
打开引入class_core.php文件,在该文件中有如下代码:
- C::creatapp();
- class core{....}
- class C extends core {}
从上可知,类c继承自core,所以C::creatapp()等价于core::creatapp(),现在来看core::creatapp()
- public static function creatapp() {
- if(!is_object(self::$_app)) {//判断$_app是不是对象
- self::$_app = discuz_application::instance(); //如果不是对象,把类discuz_application中instance方法返回结果赋值给$_app;
- } //phpfensi.com
- return self::$_app;//返回$_app
- }
这里又出现了一个类discuz_application,这个类定义在./source/class/discuz/discuz_application.php文件中,这里并没有引用该文件,那么这个类是如何实现调用的呢?这里就涉及到了类的另外一种加载方法:类自动加载,当类discuz_application不存在是就会调用下面的:
- if(function_exists('spl_autoload_register')) {
- spl_autoload_register(array('core', 'autoload'));
- } else {
- function __autoload($class) {
- return core::autoload($class);
- }
- }
这里最终会执行的是ore::autoload().
这里都会调用 core::autoload('discuz_application');下面进入到autoload方法:
- public static function autoload($class) {
- //分析类名,获取类所在的目录
- $class = strtolower($class);
- if(strpos($class, '_') !== false) {
- list($folder) = explode('_', $class);
- $file = 'class/'.$folder.'/'.substr($class, strlen($folder) + 1);
- } else {
- $file = 'class/'.$class;
- }
- //执行后$file='class/discuz/application'
- try {
- //调用import方法
- self::import($file);
- return true;
- } catch (Exception $exc) {
- $trace = $exc->getTrace();
- foreach ($trace as $log) {
- if(emptyempty($log['class']) && $log['function'] == 'class_exists') {
- return false;
- }
- }
- discuz_error::exception_error($exc);
- }
- }
下面该进入self::import($file);self表示类本身,所以就等价于:core::import($file),也就是core::import('class/discuz/application'):
- public static function import($name, $folder = '', $force = true) {
- //分析传入的参数$file,获取类所在的文件名及路径
- $key = $folder.$name;
- if(!isset(self::$_imports[$key])) {
- $path = DISCUZ_ROOT.'/source/'.$folder;
- if(strpos($name, '/') !== false) {
- $pre = basename(dirname($name));
- $filename = dirname($name).'/'.$pre.'_'.basename($name).'.php';
- } else {
- $filename = $name.'.php';
- }
- //确定文件名及路径$filename=‘class/discuz/discuz_application.php’
- //引入文件
- if(is_file($path.'/'.$filename)) {
- include $path.'/'.$filename;
- self::$_imports[$key] = true;
- return true;
- } elseif(!$force) {
- return false;
- } else {
- throw new Exception('Oops! System file lost: '.$filename);
- }
- }
- return true;
- }
上面已近分析了discuz_application的自动加载,下面回到上面讲到的self::$_app=discuz_application::instance()部分,现在已经知道这个类的位置,我们进入到/source/class/discuz/discuz_application.php,找到instance()方法:
- //这是个引用返回方法.
- static function &instance() {
- static $object;
- if(emptyempty($object)) {
- $object = new self();
- }
- return $object;
- }
- //通过这个方法将类discuz_application实例化,实例对象即:$object,那么self::$_app=discuz_application::instance()也就是相当于把对象赋给了self::$_app
至此,class_core.php文件中的C::creatapp();也就执行完毕了,现在回到member.php中.
- require './source/class/class_core.php';//引入class_core.php
- $discuz = C::app();//调用类C中的app方法
我们再来看看class_core.php文件中的C::app();
- public static function app() {
- return self::$_app;
- }
这个很简单啦,就是返回其成员$_app,前面已近说了$_app就是类discuz_application的实例化.
ok,现在再来看$discuz = C::app(),这也就是说又将类discuz_application的实例化赋值给了$discuz,那么$discuz->var['mod']就很好理解了.
$discuz->var['mod']就表示类discuz_application的对象$discuz中的成员var['mod'];
我们再来看看类discuz_application中的var:
- global $_G;
- $_G = array(....此处省略5km代码)
- //....此处再省略5km代码
- if(defined('SUB_DIR')) {
- $_G['siteurl'] = str_replace(SUB_DIR, '/', $_G['siteurl']);
- $_G['siteroot'] = str_replace(SUB_DIR, '/', $_G['siteroot']);
- }
- $this->var = & $_G;
现在明白了var实际上就是全局变量$_G,至于键值可以mod在$_G是没有的,继续往下看:
在方法_init_input()中有如下定义:
$this->var['mod'] = empty($_GET['mod']) ? '' : dhtmlspecialchars($_GET['mod']);
又是一个3元运算符,这下彻底明白了var['mod']表示的就是url中变量mod参数,自此总算搞清楚了,在构造函数中包含了这个函数,所以实例化时就已经执行了这个函数:
- public function __construct() {
- $this->_init_env();
- $this->_init_config();
- $this->_init_input();
- $this->_init_output();
- }
这里有一个方法:dhtmlspecialchars():
- function dhtmlspecialchars($string) {
- if(is_array($string)) {
- foreach($string as $key => $val) {
- $string[$key] = dhtmlspecialchars($val);
- }
- } else {
- $string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string);
- if(strpos($string, '
Tags: discuz X3 2 $discuz->var
相关文章
- ·Discuz3.1论坛升级问题集(2013-11-15)
- ·升级Discuz3.1时update.php访问出错(2013-11-15)
- ·discuz论坛项目总结(2013-11-15)
- ·怎么让discuz网站版块下面显示版块简介(2013-11-15)
- ·导致Discuz!论坛出现空白页面的一些原因及解决方法简要分析(2013-11-15)
- ·百度discuz结构化数据插件上线 收录有望(2013-11-15)
- ·discuz email 已经被注册的解决办法(2013-11-29)
- ·php中用curl模拟登录discuz以及模拟发帖(2014-01-06)
- ·discuz X3全局变量$_G(2014-01-10)
- ·discuz模板制作过程中的几点总结(2014-01-10)
- ·最新Discuz防灌水的方法和防灌水插件的推荐(2014-01-10)
- ·Discuz论坛 创始人/超级管理员密码忘记解决办法(2014-01-10)
- ·discuz发私信,GBK格式英文或者数字可以显示,中文不显示(2014-03-31)
- ·discuz和jquery冲突暂行解决办法(2014-03-31)
- ·Discuz X3 mysql数据库主从同步 读写分离(2014-03-31)
- ·有关discuz在修改过程中的一些配置以及文件位置(2014-03-31)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)