我有一个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
更多信息,请阅读变量作用域文档
注:全局变量不好