【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();???再說吧。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章