全局变量初始化问题

时间:2014-07-30 09:58:15

标签: php drupal-7

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

$test =1;

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

但是当用户登录时Drupal调用了这个钩子函数“mymodule_user_login” - $ test的值被发现为null。

可能是什么原因?

我尝试过谷歌搜索,但找不到有用的答案。

7 个答案:

答案 0 :(得分:3)

唯一不起作用的方法是文件是否包含在函数中。例如,您的代码位于foo.php,并执行为:

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

然后$test不在global范围内,因此函数也无法从那里获取它。我不知道Drupal,但看起来很可能就是这种情况。

真正的解决方案不是使用global范围,正是因为这一点,并且因为全球状态很快就会陷入疯狂。

此特定情况的本地化解决方案是在global $test之前编写$test = 1以在全局范围内显式声明该变量,无论何时可以包含该变量。

答案 1 :(得分:0)

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

global $abc;
$abc = 'value';

function mymodule_user_login(){
    global $abc;
    echo $abc;
}
mymodule_user_login();

// output:value;

答案 2 :(得分:0)

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

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

$test = 1;

function mymodule_user_login() {
   print $GLOBALS['test'];
   // print "Just a string $GLOBALS[test]";
}

以下是关于变量范围的php.net文章的链接,以获取更好的信息: PHP: Variable Scope

答案 3 :(得分:0)

您需要首先声明全局变量,作为全局变量。最好在hook init函数中声明。

// 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";
}

之后,您可以在任何模块中访问全局变量。

答案 4 :(得分:0)

根据我编写wordpress插件的经验(我假设它有一些类似的方法来清理变量)我知道你必须在声明之前将变量添加到全局范围。他就是一个例子:

global $test;
$test =1;

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

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

答案 5 :(得分:0)

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

如果你检查了Drupal安装根目录下的index.php文件,你会注意到脚本处理的几乎所有内容都发生在另一个函数中,这意味着极少数变量在全局范围内 。几乎所有这些都是从drupal_bootstrap()中开始的。

我会对另一个答案发表评论但是没有声誉可以做到这一点。

虽然这样做了:

global $test;
$test =1;

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

答案 6 :(得分:0)

将关键字 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

了解更多信息,请阅读variables scope documentation

P.S。 Global Variables Are Bad