全局内部和外部的PHP函数?

时间:2013-09-12 08:40:57

标签: php

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

$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"

我很确定第一种方式是正确的,第二种方式并不意味着什么,不过第二种方法是有效的,第一种方式不起作用。

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

1 个答案:

答案 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"
}