Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

建议在class_core.php中添加对$_G的声明

[复制链接]
@余新启 发表于 2012-8-5 00:20:52 | 显示全部楼层 |阅读模式
本帖最后由 @余新启 于 2012-8-5 00:22 编辑

在调阅x2.5源代码的过程中发现找不到类似$_G=array()这样的的声明语句,使很多同学困惑于这个变量,我也是,然后我开始调试代码...到底$_G是在何处定义的呢?从论坛搜出来的贴子有很多同学在问这个问题,其实大家就想在不调试代码的时候知道这个答案,开发组的同学有回答,但都有装B的嫌疑,从不正面回答,让我们去看class_core.php,我知道这个文件几乎被所有文件包含,从头到脚看一遍我还是不知道这个变量在哪定义的。经过调试我可以确信开发人员没有很明确的定义过这个变量,最早出现$_G的地点是class_core.php调用/source/class/discuz/discuz_application.php中定义的类初始化环境时即self:_app = discuz_application::instance();中调用了_init_env()方法,这个方法中有一句global $_G起到了先声明全局变量$_G后再引用全局$_G的作用。在强调代码可读性的今天,个人觉得这种做法并不友好。几乎所有文件都能见到global $_G引用全局变量这样的语句,是问不通过调试谁能知道到底哪句global $_G是用来定义$_G这个变量的呢?

回复

使用道具 举报

左手的爱 发表于 2012-8-5 09:17:19 | 显示全部楼层
这个好专业啊
回复

使用道具 举报

sw08 发表于 2012-8-5 10:28:43 | 显示全部楼层
看你纠结的,一看就是没怎么做过DZ插件了,这个变量这么用的意义,我这么解释吧:
/source/class/discuz/discuz_application.php(X2.5)
/source/class/class_core.php(X2.0)
在这个文件的_init_env()方法中global $_G的含义就是为了声明这是个全局变量,里面存放的是一些系统最频繁用到的相关的全局信息,主要是为了后面对各功能实现的便利性。例如我要得知当前用户的UID,那我直接读取$_G['uid']就行了,而不用再二次查询session或者数据库,这样可以提高效率,编写其余的各模块程序,代码量也会变得非常简洁。

如果你要问哪里是定义,就是这段(省略一大段):
                global $_G; //为了声明这是全局变量
                $_G = array(
                        'uid' => 0,
                        'username' => '',
                         ..................
                );


在除了这个文件以外的其它文件,如果用了global $_G,则表示为了传递这个变量。
例如说我在插件开发中,有这样的方法:

        function viewthread_postfooter_output(){
                global $_G; //表示传递变量,而不是声明全局               
                return $_G['uid'];
        }


对开发者来说$_G变量的存在意义是“只读”的,换句话说,没有人会写程序的时候,随便去初始化这个变量。

另外作为商业机构而不是公益科研机构的程序作品,工作人员也没有义务来告诉你代码含义吧,所谓的可读性还请自己多加学习理解了?这好比没有哪家饭店主动把招牌菜的烹饪秘方主动告诉顾客一样。
回复

使用道具 举报

波︶ㄣ依然 发表于 2012-8-5 12:14:26 | 显示全部楼层
{:soso_e100:}呵呵 ~!!!
回复

使用道具 举报

 楼主| @余新启 发表于 2012-8-5 13:28:11 | 显示全部楼层
sw08 发表于 2012-8-5 10:28
看你纠结的,一看就是没怎么做过DZ插件了,这个变量这么用的意义,我这么解释吧:
/source/class/discuz/d ...

你没认真看我的贴子,你说的我都懂。我在贴子里面也说明了。我只是觉得这种用global声明变量的方式不友好。因为很多函数都是通过这种方式调用$_G的。
回复

使用道具 举报

www.jj92.net 发表于 2012-8-5 15:45:19 | 显示全部楼层
不懂怎么弄
回复

使用道具 举报

ren3610 发表于 2012-8-5 18:38:38 | 显示全部楼层
真心不太懂程序。

但是看的懂。

学习。
回复

使用道具 举报

mark35 发表于 2012-8-6 14:10:02 | 显示全部楼层
sw08 发表于 2012-8-5 10:28
看你纠结的,一看就是没怎么做过DZ插件了,这个变量这么用的意义,我这么解释吧:
/source/class/discuz/d ...

其实相当于在函数内定义了个全局变量然后再赋值
回复

使用道具 举报

 楼主| @余新启 发表于 2012-8-6 21:35:49 | 显示全部楼层
mark35 发表于 2012-8-6 14:10
其实相当于在函数内定义了个全局变量然后再赋值

我贴子里要表明的就是这个意思,sw08的观点有点偏激,而且没有好好看我的表述,也许我的表述不是很容易让人看懂吧。
回复

使用道具 举报

huangliming 发表于 2012-8-7 09:29:43 | 显示全部楼层
呵呵,分享一下Discuz!技术文库:http://dev.discuz.org/wiki/
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-8-25 18:10 , Processed in 0.110999 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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