【discuzX2.5】$_G在哪?

/source/class/discuz/discuz_application.php(X2.5)
/source/class/class_core.php(X2.0)

在discuz_application.php的_init_env()方法中定义了$_G,里面存放的是一些系统最频繁用到的相关的全局信息,主要是为了后面对各功能实现的便利性。

 
例如:
我要得知当前用户的UID,那我直接读取$_G['uid']就行了,而不用再二次查询session或者数据库,这样可以提高效率,编写其余的各模块程序,代码量也会变得非常简洁。

 
【私人例子:
\source\module\course\
edit.php:
$pathHead = $_G["setting"]["attachurl"]."course/title/";
$query = DB :: query("SELECT grouptitle, groupid FROM {$_G['config'][db][1][tablepre]}common_usergroup WHERE type = 'Member' AND creditshigher >= 0");

定义:
/source/class/discuz/
discuz_application.php:
class discuz_application extends discuz_base
{
	private function _init_env()
 	{
		
		(省略一大段)
global $_G; //为了声明这是全局变量
$_G = array(
'uid' => 0,
'username' => '',
'adminid' => 0,
'groupid' => 1,
'sid' => '',
'formhash' => '',
'connectguest' => 0,
'timestamp' => TIMESTAMP,
'starttime' => microtime(true),
'clientip' => $this->_get_client_ip(),
'referer' => '',
'charset' => '',
'gzipcompress' => '',
'authkey' => '',
'timenow' => array(),
'widthauto' => 0,
'disabledwidthauto' => 0,


'PHP_SELF' => '',
'siteurl' => '',
'siteroot' => '',
'siteport' => '',


'config' => array(),
'setting' => array(),
'member' => array(),
'group' => array(),
'cookie' => array(),
'style' => array(),
'cache' => array(),
'session' => array(),
'lang' => array(),
'my_app' => array(),
'my_userapp' => array(),


'fid' => 0,
'tid' => 0,
'forum' => array(),
'thread' => array(),
'rssauth' => '',


'home' => array(),
'space' => array(),


'block' => array(),
'article' => array(),


'action' => array(
'action' => APPTYPEID,
'fid' => 0,
'tid' => 0,
),


'mobile' => '',


);
 
		$_G['PHP_SELF'] = dhtmlspecialchars($this->_get_script_url());
		$_G['basescript'] = CURSCRIPT;
		$_G['basefilename'] = basename($_G['PHP_SELF']);
		$sitepath = substr($_G['PHP_SELF'], 0, strrpos($_G['PHP_SELF'], '/'));
		if(defined('IN_API')) {
			$sitepath = preg_replace("/\/api\/?.*?$/i", '', $sitepath);
		} elseif(defined('IN_ARCHIVER')) {
			$sitepath = preg_replace("/\/archiver/i", '', $sitepath);
		}
		$_G['siteurl'] = dhtmlspecialchars('http://'.$_SERVER['HTTP_HOST'].$sitepath.'/');


		$url = parse_url($_G['siteurl']);
		$_G['siteroot'] = isset($url['path']) ? $url['path'] : '';
		$_G['siteport'] = empty($_SERVER['SERVER_PORT']) || $_SERVER['SERVER_PORT'] == '80' ? '' : ':'.$_SERVER['SERVER_PORT'];


		if(defined('SUB_DIR')) {
			$_G['siteurl'] = str_replace(SUB_DIR, '/', $_G['siteurl']);
			$_G['siteroot'] = str_replace(SUB_DIR, '/', $_G['siteroot']);
		}


		$this->var = & $_G;
	}
}
$pathHead = $_G["setting"]["attachurl"]."course/title/";
$query = DB :: query("SELECT grouptitle, groupid FROM {$_G['config'][db][1][tablepre]}common_usergroup WHERE type = 'Member' AND creditshigher >= 0");
】

定义:
/source/class/discuz/
discuz_application.php:
class discuz_application extends discuz_base
{
	private function _init_env()
 	{
		
		(省略一大段)
                global $_G; //为了声明这是全局变量
		$_G = array(
			'uid' => 0,
			'username' => '',
			'adminid' => 0,
			'groupid' => 1,
			'sid' => '',
			'formhash' => '',
			'connectguest' => 0,
			'timestamp' => TIMESTAMP,
			'starttime' => microtime(true),
			'clientip' => $this->_get_client_ip(),
			'referer' => '',
			'charset' => '',
			'gzipcompress' => '',
			'authkey' => '',
			'timenow' => array(),
			'widthauto' => 0,
			'disabledwidthauto' => 0,


			'PHP_SELF' => '',
			'siteurl' => '',
			'siteroot' => '',
			'siteport' => '',


			'config' => array(),
			'setting' => array(),
			'member' => array(),
			'group' => array(),
			'cookie' => array(),
			'style' => array(),
			'cache' => array(),
			'session' => array(),
			'lang' => array(),
			'my_app' => array(),
			'my_userapp' => array(),


			'fid' => 0,
			'tid' => 0,
			'forum' => array(),
			'thread' => array(),
			'rssauth' => '',


			'home' => array(),
			'space' => array(),


			'block' => array(),
			'article' => array(),


			'action' => array(
				'action' => APPTYPEID,
				'fid' => 0,
				'tid' => 0,
			),


			'mobile' => '',


		);
		$_G['PHP_SELF'] = dhtmlspecialchars($this->_get_script_url());
		$_G['basescript'] = CURSCRIPT;
		$_G['basefilename'] = basename($_G['PHP_SELF']);
		$sitepath = substr($_G['PHP_SELF'], 0, strrpos($_G['PHP_SELF'], '/'));
		if(defined('IN_API')) {
			$sitepath = preg_replace("/\/api\/?.*?$/i", '', $sitepath);
		} elseif(defined('IN_ARCHIVER')) {
			$sitepath = preg_replace("/\/archiver/i", '', $sitepath);
		}
		$_G['siteurl'] = dhtmlspecialchars('http://'.$_SERVER['HTTP_HOST'].$sitepath.'/');


		$url = parse_url($_G['siteurl']);
		$_G['siteroot'] = isset($url['path']) ? $url['path'] : '';
		$_G['siteport'] = empty($_SERVER['SERVER_PORT']) || $_SERVER['SERVER_PORT'] == '80' ? '' : ':'.$_SERVER['SERVER_PORT'];


		if(defined('SUB_DIR')) {
			$_G['siteurl'] = str_replace(SUB_DIR, '/', $_G['siteurl']);
			$_G['siteroot'] = str_replace(SUB_DIR, '/', $_G['siteroot']);
		}


		$this->var = & $_G;
	}
}


 
眼神很亮地看到了$this->var = & $_G;
【私人例子:
	/
	course.php:
	$discuz = & discuz_core::instance();			/* & discuz_core:: ??????????*/
	$mod = !in_array($discuz->var['mod'], $modarray) ? 'list' : $discuz->var['mod'];
	看不懂~~于是下文:
	
/source/class/discuz/
discuz_application.php:
class discuz_application extends discuz_base
{
	
static function &instance()
 	{
		static $object;
		if(empty($object)) 
		{
			$object = new self();
		}
		return $object;
	}
	函数&instance创建了一个静态变量(变量??),若他为空则new self()。应该是new了一个class discuz_application的对象。
	暂时理解为。。当前实例句柄。。。然后去找了forum.php,home.php。。。没有发现。
	应该是为了统一管理像mod这样的变量吧(猜测。mod是为了存储当前的mod(edit,list等等。))
	
	回到$this->var = & $_G;
	$discuz->var['mod']等价于$_G['mod']
	
	于是又牵扯到了$_G['mod'] (烦死了有木有~!!!)
	在discuz_application.php中搜索$_G['mod']。
	
/source/class/discuz/
discuz_application.php:
class discuz_application extends discuz_base
{
	
	public function init()
	 {
		if(!$this->initated)
		 {
			$this->_init_db();
			$this->_init_setting();
			$this->_init_user();
			$this->_init_session();
			$this->_init_mobile();
			$this->_init_cron();
			$this->_init_misc();
		}
		$this->initated = true;
	}
	public function __construct()
	 {
		$this->_init_env();
		$this->_init_config();
		$this->_init_input();
		$this->_init_output();
	}
	private function _init_input() 
	{
		$this->var['mod'] = empty($_GET['mod']) ? '' : dhtmlspecialchars($_GET['mod']);
	}
}
推测,当new一个class discuz_application对象时。调用__constract()。就会创建一个$_G['mod']。。可能为空,可能有值。而当每次页面跳转打到course.php。都会对mod重新赋值。
于是再看course.php:
/
course.php:
define('CURMODULE', $mod);
$discuz->init();
看到define。。应该就是他了。'CURMODULE'是什么???再说吧。。。
discuz_application.php中也没有找到 $this->_init_setting();???再说吧。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值