我在PHP中的全局变量的麻烦。 我有一个$screen
在一个文件中设定的变种,这需要调用的另一个文件initSession()
在另一个文件中定义。 该initSession()
宣布global $screen
,然后进一步处理$屏幕下使用非常的第一个脚本设置的值。
这怎么可能?
为了使事情变得更加混乱,如果您尝试重新设置$屏幕,然后调用initSession()
它使用第一再次使用的值。 下面的代码将描述该过程。 可能有人有在解释此一展身手?
$screen = "list1.inc"; // From model.php
require "controller.php"; // From model.php
initSession(); // From controller.php
global $screen; // From Include.Session.inc
echo $screen; // prints "list1.inc" // From anywhere
$screen = "delete1.inc"; // From model2.php
require "controller2.php"
initSession();
global $screen;
echo $screen; // prints "list1.inc"
更新:
如果我宣布$screen
只需要第二个模型前再次全球,$屏幕是正确更新initSession()
方法。 奇怪。
Global
不会使变量全球。 我知道这是棘手的:-)
Global
说,一个局部变量将被用作如果它是具有较高作用域的变量 。
EG:
<?php
$var = "test"; // this is accessible in all the rest of the code, even an included one
function foo2()
{
global $var;
echo $var; // this print "test"
$var = 'test2';
}
global $var; // this is totally useless, unless this file is included inside a class or function
function foo()
{
echo $var; // this print nothing, you are using a local var
$var = 'test3';
}
foo();
foo2();
echo $var; // this will print 'test2'
?>
需要注意的是全局变量很少是个好主意。 你可以没有他们码的时间99.99999%,你的代码更易于维护,如果你没有模糊范围。 避免global
如果你能。
global $foo
并不意味着“使这个变量全球,让每个人都可以使用它。” global $foo
含义是“功能的范围内 ,使用全局变量$foo
”。
我从你的榜样,每次,你是从一个函数中提及$屏幕假设。 如果是这样你需要使用global $screen
中的每个功能。
你需要把“全球$屏幕”在每一个引用它,不只是在每个文件的顶部功能。
If you have a lot of variables you want to access during a task which uses many functions, consider making a 'context' object to hold the stuff:
//We're doing "foo", and we need importantString and relevantObject to do it
$fooContext = new StdClass(); //StdClass is an empty class
$fooContext->importantString = "a very important string";
$fooContext->relevantObject = new RelevantObject();
doFoo($fooContext);
Now just pass this object as a parameter to all the functions. You won't need global variables, and your function signatures stay clean. It's also easy to later replace the empty StdClass with a class that actually has relevant methods in it.
全球范围跨度包括和需要的文件,你不需要使用global关键字,除非使用变量在一个函数中。 你可以尝试使用$ GLOBALS数组来代替。
这是没用的,直到它是在函数或类。 环球意味着你可以在程序的任何部分使用的变量。 因此,如果全球没有在函数或类包含有没有用用全球的