Hello, everybody.

While working with static variables inside static class' methods, I have
found this very interesting (at least for me) behavior of PHP.

Consider the following class definitions (example #1):

class X {
public final static function test() {
static $i;
return ++$i;
}
}

class Y extends X {
}

By executing this code:

echo X::test();
echo Y::test(); // note Y class here

one would expect to see "12" as output, but apparently I get "11".

That's a bit confusing if you logically assume that "static vars" are "tied
to the scope" they're defined in. Since this static variable is
defined in a specific static method test(), that is NOT overloaded by class
Y, in my opinion it shoul've preserved it's value across static calls.

Let's look at another example (example #2):

class X {
public static $x =0;
public final static function test() {
return ++static::$x; // note static keyword here
}
}

class Y extends X {
}

If you run this code:

echo X::test();
echo Y::test();

you get "12" as output - the expected output. Notice that the "++static::$x"
expr. is taking advantage of late static binding. Now, if you change
body of test() to the following code:

public final static function test() {
return ++self::$x;
}

then you also get "12" as output.

Is this a bug that static context of $i is not preserved in example #1 or do
I misunderstand something?

I could not find any hints on this in the PHP documentation.

Dmitry.

Reply via email to