I think you are confusing scope visibility level of the variable within method and the class. Variable within the method is going to 1 because it was declare within the test method and there no link to the one declared outside the test method. The second case is referencing the varible of the class. 2011/7/6 Дмитрий Степанов <dmitrij@xxxxxxxxxxx> > 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. >