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