static variables inside static methods

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux