49

I am trying to change a variable that is outside of a function, from within a function. Because if the date that the function is checking is over a certain amount I need it to change the year for the date in the beginning of the code.

$var = "01-01-10";
function checkdate(){
     if("Condition"){
            $var = "01-01-11";
      }
}
Chris Bier
  • 14,183
  • 17
  • 67
  • 103

4 Answers4

76

A. Use the global keyword to import from the application scope.

$var = "01-01-10";
function checkdate(){
    global $var;  
    if("Condition"){
        $var = "01-01-11";
    }
}
checkdate();

B. Use the $GLOBALS array.

$var = "01-01-10";
function checkdate(){
    if("Condition"){
        $GLOBALS['var'] = "01-01-11";
    }
}
checkdate();

C. Pass the variable by reference.

$var = "01-01-10";
function checkdate(&$funcVar){  
    if("Condition"){
        $funcVar = "01-01-11";
    }
}
checkdate($var);
Alin Purcaru
  • 43,655
  • 12
  • 77
  • 90
  • For the third example (C), should the first and last lines reference $var or $funcVar...or should that last line be `$var = checkdate($var);`? – Jeromy French Jul 23 '14 at 21:02
  • 3
    @JeromyFrench The first and last line refer to the variable in the outer scope, named `$var`. Inside the function it may have any other name, so I chose `$funcVar` specifically to illustrate that the name may be different. Regarding `$var = checkdate($var);`, the whole purpose of the example was to show passing _by reference_ and changing the passed variable directly in the function. – Alin Purcaru Jul 24 '14 at 12:21
  • 2
    Ok, I think I get it. `function checkdate(&$funcVar)` combined with `checkdate($var);` maps the outer `$var` to the inner `$funcVar`. – Jeromy French Jul 24 '14 at 14:17
  • There is also another option, you pass a class/object variable to your function, then it will be passed by reference. See https://stackoverflow.com/a/9696799/5842403 to avoid this you have to clone it – Joniale Feb 17 '20 at 13:11
  • Another option would be to use class/object value inside a method, and reference to it by $object->var or by Class:$var – M_per Nov 24 '21 at 13:17
  • Call-time pass by reference was removed in PHP5.4. For those running PHP5.4 or later Option C may not work anymore – DavidG Jul 31 '22 at 22:16
45

Just use the global keyword like so:

$var = "01-01-10";
function checkdate(){
     global $var;

     if("Condition"){
            $var = "01-01-11";
      }
}

Any reference to that variable will be to the global one then.

Buggabill
  • 13,726
  • 4
  • 42
  • 47
  • but i want to change the global variable so whatever i set var to, will it effect the global variable outside of the function? – Chris Bier Nov 08 '10 at 20:38
  • 4
    That is what this will do. Using `global` changes the variable `$var` inside the function to point to the global one. When you change that variable inside the function, it will change the global one. – Buggabill Nov 08 '10 at 20:41
8

All the answers here are good, but... are you sure you want to do this?

Changing global variables from within functions is generally a bad idea, because it can very easily cause spaghetti code to happen, wherein variables are being changed all over the system, functions are interdependent on each other, etc. It's a real mess.

Please allow me to suggest a few alternatives:

1) Object-oriented programming

2) Having the function return a value, which is assigned by the caller.

e.g. $var = checkdate();

3) Having the value stored in an array that is passed into the function by reference

function checkdate(&$values) { if (condition) { $values["date"] = "01-01-11"; } }

Hope this helps.

Douglas Muth
  • 336
  • 1
  • 4
6

Try this pass by reference

  $var = "01-01-10";
    function checkdate(&$funcVar){  
        if("Condition"){
            $funcVar = "01-01-11";
        }
    }
    checkdate($var);

or Try this same as the above, keeping the function as same.

 $var = "01-01-10";
    function checkdate($funcVar){  
        if("Condition"){
            $funcVar = "01-01-11";
        }
    }
    checkdate(&$var);
rizon
  • 8,127
  • 1
  • 27
  • 17