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

2022-08-30 15:50:18

我在php中的全局变量上遇到了麻烦。我在一个文件中设置了一个var,它需要另一个文件调用另一个文件中定义的文件。声明然后使用第一个脚本中设置的值进一步向下处理$screen。$screeninitSession()initSession()global $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将针对该方法正确更新。奇怪。$screeninitSession()


答案 1

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


答案 2

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

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


推荐