类discuz_application中_init_env方法2

2025-10-17 01:18:41

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'] = dhtmlspecialchars($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", '', $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’。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢