请选择 进入手机版 | 继续访问电脑版
查看: 78|回复: 0

Discuz X获取全局变量getglobal()函数详解

[复制链接]

494

主题

496

帖子

2576

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2576
发表于 2021-6-4 18:03:46 | 显示全部楼层 |阅读模式
在Discuz! X系列中有一个获取全局变量的函数getglobal(),使用它或以获取到$_G数组中的变量。

最近对Discuz X系列中的代码进行了拆解,看到了一个实用的获取$_G中信息的函数。

以下是Discuz X1程序代码中的函数原型:
./source/function/function_core.php 第55行开始:
  1. function setglobal($key , $value, $group = null) {
  2. global $_G;
  3. $k = explode('/', $group === null ? $key : $group.'/'.$key);
  4. switch (count($k)) {
  5. case 1: $_G[$k[0]] = $value; break;
  6. case 2: $_G[$k[0]][$k[1]] = $value; break;
  7. case 3: $_G[$k[0]][$k[1]][$k[2]] = $value; break;
  8. case 4: $_G[$k[0]][$k[1]][$k[2]][$k[3]] = $value; break;
  9. case 5: $_G[$k[0]][$k[1]][$k[2]][$k[3]][$k[4]] =$value; break;
  10. }
  11. return true;
  12. }
  13. function getglobal($key, $group = null) {
  14. global $_G;
  15. $k = explode('/', $group === null ? $key : $group.'/'.$key);
  16. switch (count($k)) {
  17. case 1: return isset($_G[$k[0]]) ? $_G[$k[0]] : null; break;
  18. case 2: return isset($_G[$k[0]][$k[1]]) ? $_G[$k[0]][$k[1]] : null; break;
  19. case 3: return isset($_G[$k[0]][$k[1]][$k[2]]) ? $_G[$k[0]][$k[1]][$k[2]] : null; break;
  20. case 4: return isset($_G[$k[0]][$k[1]][$k[2]][$k[3]]) ? $_G[$k[0]][$k[1]][$k[2]][$k[3]] : null; break;
  21. case 5: return isset($_G[$k[0]][$k[1]][$k[2]][$k[3]][$k[4]]) ? $_G[$k[0]][$k[1]][$k[2]][$k[3]][$k[4]] : null; break;
  22. }
  23. return null;
  24. }
复制代码

在最新版本的Discuz X3.5中setglobal()、getglobal()两个函数代码原型如下:
  1. function setglobal($key , $value, $group = null) {
  2.         global $_G;
  3.         $key = explode('/', $group === null ? $key : $group.'/'.$key);
  4.         $p = &$_G;
  5.         foreach ($key as $k) {
  6.                 if(!isset($p[$k]) || !is_array($p[$k])) {
  7.                         $p[$k] = array();
  8.                 }
  9.                 $p = &$p[$k];
  10.         }
  11.         $p = $value;
  12.         return true;
  13. }

  14. function getglobal($key, $group = null) {
  15.         global $_G;
  16.         $key = explode('/', $group === null ? $key : $group.'/'.$key);
  17.         $v = &$_G;
  18.         foreach ($key as $k) {
  19.                 if (!isset($v[$k])) {
  20.                         return null;
  21.                 }
  22.                 $v = &$v[$k];
  23.         }
  24.         return $v;
  25. }
复制代码

上面的两个函数,第一个是设置 全局变量$_G,第二个是获取全局变量中$_G层级内的变量。

使用方法非常简单:如获取$_G['member']['uid'] (用户的uid) ,可以这样书写:$uid = getglobal('uid', 'member');

使用getblobal()函数获取信息的几种方法:
  1. echo $_G['member']['uid'];//获取用户id
  2. $uid = getglobal('uid', 'member');//获取用户id,去掉member也可以
  3. echo $uid;
  4. $username = getglobal('username');//获取用户名
  5. echo $username;
复制代码

这在X里面是个非常方便的设计,相比做过uchome开发的人一定对这个会产生共鸣的,uchome中,大家都习惯使用$_SGLOBAL['member']['uid'],但是$_SGLOBAL这个全局变量很庞大,使用起来可能会写非常长的数组来获取自己想要得到的东西。代码写的多了以后会发现,有大量的数组堆叠。不适合与二次开发以后的二次修改。

上面的贴心设计基本上解决了这个。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|蓄财网 ( 豫ICP备2021002293号 )

GMT+8, 2021-6-17 01:53 , Processed in 0.078129 second(s), 22 queries .

蓄财网 ©版权所有

© 2021 蓄财网(www.aixc.cn)

快速回复 返回顶部 返回列表