我有一个Drupal文件(mymodule.module),其中包含类似(实际代码非常长)的内容:
$test =1;
//hook_user_login
function mymodule_user_login()
{
global $test;
print "$test";
}
但是当用户登录时Drupal调用了这个钩子函数“mymodule_user_login” - $ test的值被发现为null。
可能是什么原因?
我尝试过谷歌搜索,但找不到有用的答案。
答案 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