Search code examples
phpglobal

global variables in php not working as expected


I'm having trouble with global variables in php. I have a $screen var set in one file, which requires another file that calls an initSession() defined in yet another file. The initSession() declares global $screen and then processes $screen further down using the value set in the very first script.

How is this possible?

To make things more confusing, if you try to set $screen again then call the initSession(), it uses the value first used once again. The following code will describe the process. Could someone have a go at explaining this?

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

Update:
If I declare $screen global again just before requiring the second model, $screen is updated properly for the initSession() method. Strange.


Solution

  • Global DOES NOT make the variable global. I know it's tricky :-)

    Global says that a local variable will be used as if it was a variable with a higher scope.

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

    Note that global vars are rarely a good idea. You can code 99.99999% of the time without them and your code is much easier to maintain if you don't have fuzzy scopes. Avoid global if you can.