我通常运行这样的代码就好了:
$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"
我很确定第一种方式是正确的,第二种方式并不意味着什么,不过第二种方法是有效的,第一种方式不起作用。
请不要浪费时间回答“全球都是错误的编程”,因为这不是手头的问题,也不是“为什么你会做这样的事情?”因为这是一个很好的例子。
答案 0 :(得分: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"
}