php 全局作用域的问题

在使用thinkphp5做网站配置项实时生效的部分

在app_init钩子函数中读取配置表中的数据,这个数据要在全部页面内可以读取,我的思路是使用$GLOABLS. 但是我看到别人的代码中使用v函数,实现和$GLOABLS一样的效果.

$data=Db:table('config')->find();
$GLOBALS['config']=$data;//我的做法
v('config)=$data;//别人的做法

附v函数代码

// 应用公共文件
if ( ! function_exists('v')) {
    /**
     * 全局变量
     *
     * @param null   $name  变量名
     * @param string $value 变量值
     *
     * @return array|mixed|null|string
     */
    function v($name = null, $value = '[null]')
    {
        static $vars = [];
        if (is_null($name)) {
            return $vars;
        } else if ($value == '[null]') {
            //取变量
            $tmp = $vars;
            foreach (explode('.', $name) as $d) {
                if (isset($tmp[$d])) {
                    $tmp = $tmp[$d];
                } else {
                    return null;
                }
            }

            return $tmp;
        } else {
            //设置
            $tmp = &$vars;
            foreach (explode('.', $name) as $d) {
                if ( ! isset($tmp[$d])) {
                    $tmp[$d] = [];
                }
                $tmp = &$tmp[$d];
            }

            return $tmp = $value;
        }
    }
}

我有点不太理解,这个函数怎么能实现项目中所有文件都能访问的变量,原理是什么样的了.请大神指教一二
可能我对php的作用域理解不够

阅读 2.1k
1 个回答

他在每个文件里都引入了公共文件,在公共文件中将v定义到了当前作用域,为了防止重复,所以在定义之前先检查了一下当前作用域有没有多次引入公共文件,没有的话才继续定义v

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题