Home » Php » PHP and Static Variables in Object Member Functions

PHP and Static Variables in Object Member Functions

Posted by: admin February 12, 2018 Leave a comment

Questions:

Up until today, I thought I had a fairly good grasp of how the static modifier worked. I know that (in laymans terms) a static variable in a function does not ‘reset’ across calls to that function, and I know that static variables and functions on a class are accessible by calling upon them through the class itself (not an instantiation of the class).

My problem is this: today I found that if I declare a static variable inside of a non-static function on a class, all instantiations of that class share that static variable in separate calls to the member function.

For example:

class A {
    public function GetValue() {
        static $value = 0;
        $value++;
        return $value;
    }
}

$instance_1 = new A();
$instance_2 = new A();
echo $instance_1->GetValue();
echo $instance_1->GetValue();

echo $instance_2->GetValue();
echo $instance_2->GetValue();

echo $instance_1->GetValue();
echo $instance_1->GetValue();

Notice that the GetValue function is neither declared as static or used in a static way (as in, called on the class itself).

Now, I always assumed that this would output: 121234

Instead, I find that it will output: 123456

Like I say, I would understand this if the static variable $value was inside of a static function. However, with it being inside a non-static function I just assumed that it would only be ‘tied’ to the function ‘within’ each individual instantiation.

I guess my question is twofold, then… 1) is this a bug or expected behaviour? 2) do other languages treat these ‘static inside non-static’ variables the same way, or is this unique to PHP?

Answers:
  1. This is expected.
  2. This is also the case in C++ (and probably others as well).

You should think of non-static class member functions as if they were just like ordinary functions, but with an implicit $this argument that is automatically provided by the interpreter. (That’s exactly how they’re implemented in most languages.)

Questions:
Answers:

I’ve copied the following information from this article by Josh Duck: http://joshduck.com/blog/2010/03/19/exploring-phps-static-scoping/

Static variables have been available since PHP 4 and allow you to define a persistent variable that is only accessible from the current function. This allows you to encapsulate state into a function or method and can eliminate the need for classes where a single function will suffice.

When a static variable is defined inside a class method they will always refer to the class on which the method was called. In doing this they act almost like properties referenced through static, though there are subtle differences.

Static variables can’t preserve the calling class scope. This can be potentially problematic if you have an inherited method containing a static variable that is called from both inside and outside its class.

Questions:
Answers:

As far as I know, all languages with static variables treat them this way. Think of static variables as global variables that can only be accessed from a certain scope.