1、foreach ($GLOBALS as $key => $value) { if (!isset($this->superglobal[$key])) { $GLOBALS[$key] = null; unset($GLOBALS[$key]); }} $GLOBALS一个包含了全部变量的全局组合数组,全局变量。$superglobal是类discuz_application属性。过滤$GLOBALS,不在$superglobal定义的键,删除。这里比较有个有意思的现象。数组$superglobal里面键GLOBALS必须存在,如果不存在,遍历后,返回空数组。
2、global $_G;定义全局变量。这个全局变量定义内容比较多。挑一点分析一下。'starttime' => microtime(true), 当前 Unix 时间戳和微秒数'clientip' => $this->_get_client_ip(), 客户端IP'remoteport' => $_SERVER['REMOTE_PORT'], 远程端口 带参数的microtime,返回一个浮点数,小编这儿测试一下,返回1566355516.5936,小数点后四位。记得有一年向java开发的一个项目api传送数据,返回时间戳错误。试了好久才发现,time()时间戳10位,而java时间戳13位。
3、$_G['PHP_SELF'] = dhtmlspecia盟敢势袂lchars($this->_get_script_url());$_G['basescript'] = CURSCRIPT;$_G['basefilename'] = basename($_G['PHP_SELF']);$sitepath = substr($_G['PHP_SELF'], 0, strrpos($_G['PHP_SELF'], '/')); $_G['PHP_SELF'],获得相对于网站根目录的路径及 PHP 程序文件名称。小编这儿测试/discuz/admin.php。CURSCRIPT模块常量,如admin.php文件开头定义 define('CURSCRIPT', 'admin');basename,返回路径中的文件名部分。小编这儿$_G['basefilename']=’admin.php’。$sitepath站点路径,应该不包括文件名。小编这儿$sitepath=’/discuz’。
4、if(defined猾诮沓靥('IN_API')) { $sitepath = preg_replace("/\/api\/?.*?$/i", 泌驾台佐39;', $sitepath);} elseif(defined('IN_ARCHIVER')) { $sitepath = preg_replace("/\/archiver/i", '', $sitepath);}if(defined('IN_NEWMOBILE')) { $sitepath = preg_replace("/\/m/i", '', $sitepath);} preg_replace正则表达式替换。\/api\/?.*?$替换/api和后面所有。这个正则表达式\/api.*这样不就可以了,为啥这么复杂?另外两个正则表达式方式一样,替换/archiver和/m,如果是这样的话$sitepath就不是文件路径了,包括文件名。如$sitepath=’/a/archiver/a.php’,替换后$sitepath=’/a/a.php’。