0

我通常运行这样的代码就好了:

$ZANE_REGISTER_RULES='this wont print';
myTest();

function myTest()
    {
    **global $ZANE_REGISTER_RULES**;
    $ZANE_REGISTER_RULES='this will actually print';
    }

echo $ZANE_REGISTER_RULES; //will print "this will actually print"

但有时(例如:如果我把它放在 phpBB 页面中)这不起作用(回声说“这不会打印”),除非我也第一次声明变量 global:

**global $ZANE_REGISTER_RULES**;
$ZANE_REGISTER_RULES='my rulessssssssssssssss';
myTest();

function myTest()
    {
    **global $ZANE_REGISTER_RULES**;
    $ZANE_REGISTER_RULES='funziona';
    }

echo $ZANE_REGISTER_RULES; //will print "this will actually print"

我很确定第一种方法是正确的,而第二种方法没有任何意义,但是第二种方法有效,第一种方法无效。

请不要浪费时间回答“全球都是糟糕的编程”,因为这不是手头的问题,也不是“你为什么要做这样的事情?” 因为这显然是一个例子。

4

1 回答 1

1

发生这种情况的原因只有一个:第二个示例中的代码是在函数的上下文中编译的。这就是$ZANE_REGISTER_RULES默认情况下具有本地范围的原因。

如果代码本身出现的源文件中没有封闭函数,这意味着该文件被函数上下文中的某个其他文件包含,例如:

var_access.php

echo "Hello ".$name."\n"; 
echo "Hello ".$_GLOBALS['name']."\n"; 

test_1.php

// Here var_access.php is included in the global context
$name = 'world';
include('var_access.php'); // Prints "Hello world" twice

test_2.php

// Here var_access.php is included in a function context
$name = 'world';
function func() {
    $name = 'function world';
    include('var_access.php'); // Prints "Hello world" and "Hello function world"
}
于 2013-09-12T08:43:38.263 回答