全局变量初始化问题


Global variable initialization issue

我有一个Drupal文件(mymodule.module),其中包含类似(实际代码很长):

$test =1;
//hook_user_login
function mymodule_user_login()
{
global $test;
print "$test";
}

但是当Drupal在用户登录时调用这个钩子函数"mymodule_user_login"时,发现$test的值为空。

原因是什么?

我试着谷歌一下,但找不到有用的答案。

如果文件包含在函数中,则无法工作。例如,您的代码在foo.php中,并以以下方式执行:

function drupal_bar() {
    include 'foo.php';
}

那么$test将不在global范围内,因此函数也不能从那里获得它。我不了解Drupal,但情况似乎是这样的。

真正的解决方案是不使用global作用域,正是因为这一点,而且因为全局状态很快就会陷入疯狂。

对于这种特殊情况的本地化解决方案也是将global $test写在$test = 1之前,以便在全局作用域中显式声明该变量,无论它可能从后面包含在何处。

在使用全局变量之前必须声明它。

global $abc;
$abc = 'value';
function mymodule_user_login(){
    global $abc;
    echo $abc;
}
mymodule_user_login();

$test可能为空的一个原因是它可能被覆盖了。因此,您可以从定义$test的地方跟踪代码,通过所有包含和要求的页面,查看$test是否被重置为另一个值,包括使用global关键字引用对象的所有函数。

除了使用global关键字外,您还可以使用超全局关联数组$GLOBALS获取全局变量。

$test = 1;
function mymodule_user_login() {
   print $GLOBALS['test'];
   // print "Just a string $GLOBALS[test]";
}
下面是关于变量作用域的php.net文章的链接:PHP:变量作用域

首先需要将全局变量声明为global。最好在钩子初始化函数中声明。

// initialization function hook
function mymodule_init() {
    global $test; // declare the global variable in init function
    $test = "Hi";
}

现在全局变量将在函数

中可用
// your function below
//hook_user_login
function mymodule_user_login()
{
     global $test;
     print "$test";
}

根据我编写wordpress插件的经验(我假设有一些类似的方法来清理变量),我知道在声明变量之前必须将变量添加到全局作用域。他是一个榜样:

global $test;
$test =1;
//hook_user_login
function mymodule_user_login()
{
global $test;
print "$test";
}

注意$test是如何在函数外部和在模块函数内部使用之前声明为全局变量的。

正如所有其他答案所述,您需要设置该变量的作用域。

如果您检查Drupal安装根目录中的index.php文件,您会注意到几乎脚本处理的所有内容都发生在另一个函数中,这意味着中只有很少的变量在全局作用域中。几乎所有这些都是从drupal_bootstrap()中启动的。

我本可以评论另一个答案,但我没有这样做的声誉。

可以这样做:

global $test;
$test =1;
//hook_user_login
function mymodule_user_login()
{
global $test;
print "$test";
}

将关键字GLOBAL放在应该被识别为全局的变量前面。

<?php
// declare test as global variable (get from global scope)
global $test;
// set global variable test
$test = 1;
function mymodule_user_login()
{
    // declare test as global variable (get from global scope)
    global $test;
    // print global variable test
    print "$test";
}
mymodule_user_login();

输出
1

使用$GLOBALS

<?php
// set global variable test
$test = 1;
function mymodule_user_login()
{
    // print global variable test
    print $GLOBALS['test'];
}
mymodule_user_login();

输出
1

更多信息,请阅读变量作用域文档

注:全局变量不好