php中的全局变量未按预期工作

时间:2008-09-20 09:10:58

标签: php global

我在php中遇到全局变量问题。我在一个文件中设置了$screen var,这需要另一个调用另一个文件中定义的initSession()的文件。 initSession()声明global $screen,然后使用第一个脚本中设置的值进一步处理$ screen。

这怎么可能?

为了让事情更加混乱,如果您尝试再次设置$ 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()方法正确更新$ screen。奇怪。

7 个答案:

答案 0 :(得分:61)

Global不要将变量设为全局变量。我知道这很棘手: - )

Global表示局部变量将被用作,就好像它是一个具有更高范围的变量

E.G:

<?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

答案 1 :(得分:15)

global $foo并不意味着“将此变量设为全局,以便每个人都可以使用它”。 global $foo表示“在此函数范围内,使用全局变量$foo”。

我假设你的例子中每次都是指函数中的$ screen。如果是这样,您需要在每个函数中使用global $screen

答案 2 :(得分:4)

您需要在引用它的每个函数中放置“global $ screen”,而不只是在每个文件的顶部。

答案 3 :(得分:4)

如果您在使用许多功能的任务期间要访问许多变量,请考虑制作一个“上下文”对象来保存这些内容:

//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);

现在只需将此对象作为参数传递给所有函数。您不需要全局变量,并且您的函数签名保持干净。稍后用一个实际上有相关方法的类替换空的StdClass也很容易。

答案 4 :(得分:1)

全局范围跨越包含和必需文件,除非在函数中使用变量,否则不需要使用global关键字。您可以尝试使用$ GLOBALS数组。

答案 5 :(得分:0)

在为其定义值之前,必须将变量声明为全局变量。

答案 6 :(得分:0)

在函数或类中它是无用的。全局意味着您可以在程序的任何部分使用变量。因此,如果全局未包含在函数或类中,则不使用全局