27

我在使用 php 中的全局变量时遇到问题。我$screen在一个文件中设置了一个 var,它需要另一个文件调用另一个文件中initSession()定义的 var。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在需要第二个模型之前再次声明全局,则 $screen 会为该initSession()方法正确更新。奇怪的。

4

7 回答 7

62

Global不会使变量成为全局变量。我知道这很棘手:-)

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

例如:

<?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如果可以,请避免。

于 2008-09-20T09:48:01.907 回答
16

global $foo并不意味着“使这个变量全局化,以便每个人都可以使用它”。global $foo意思是“在这个函数的范围内,使用全局变量$foo”。

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

于 2008-09-20T09:48:58.410 回答
5

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

于 2008-09-20T09:15:00.440 回答
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 替换为其中实际上具有相关方法的类。

于 2008-09-20T10:17:31.600 回答
1

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

于 2008-09-20T09:23:11.607 回答
1

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

于 2012-07-01T18:19:58.113 回答
0

It is useless till it is in the function or a class. Global means that you can use a variable in any part of program. So if the global is not contained in the function or a class there is no use of using Global

于 2014-05-29T06:05:27.377 回答