PHP global variable is undefined inside a function even if global keyword is used

21,914

Solution 1

I'll bet a beer you are not inside the global scope with this snippet. Are you calling this from within a function?

In that case, the $from you define in something.php is not global, while the one you reference in the function is.

It will probably work if you add a global $from; inside something.php before you define $from.

Needless to say, it's not a nice practice either way, and you should follow Gordon's advice.

Solution 2

Do yourself a favor and use Dependency Injection.

function myfunc($from) {
    return "from(myfunc)=$from<br />";
}
$from = '2010-05-01';
echo myfunc($from);

Doing so will make your code more maintainable, less coupled and more easily unit-testable because it is isolated from the global scope. Plus, when you do it people think you are cool.

Share:
21,914
Francesco Mangia
Author by

Francesco Mangia

Updated on July 08, 2020

Comments

  • Francesco Mangia
    Francesco Mangia almost 4 years

    Yes I know global variables is a bad practice, but ease up on that rule for this one :P

    My code:

    include('something.php'); //where $from is declared
    
    function myfunc() {
        global $from;
        echo "from(myfunc)=$from<br />";
        ...
    }
    
    echo "from=$from<br />";
    myfunc();
    

    The result is:

    from=2010-05-01
    from(myfunc)=
    

    What's going on? :(

    EDIT: If it helps, all the code above is inside a view file in CodeIgniter ( and yes, I know functions are not supposed to be inside views :P )

  • Pekka
    Pekka almost 14 years
    +1 I've never realized I can say "I've being doing dependency injection since 2002" :)
  • Francesco Mangia
    Francesco Mangia almost 14 years
    Hi Pekka, you're right. I added $GLOBALS['from'] = 'value' outside the function, and the value was found inside myfunc(). I didn't realize this page was generated by CodeIgniter's $this->load->view() function. Thanks!
  • Francesco Mangia
    Francesco Mangia almost 14 years
    Thanks, I'll be using Dependency Injection instead :P