[PHP] static variables inside static methods
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.
Re: [PHP] static variables inside static methods
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 Дмитрий Степанов dmit...@stepanov.lv 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.
Re: [PHP] static variables inside static methods
The second case is referencing the varible of the class. Maybe you are right. However, I don't really think that there is a true reference to the class var in example #2. PHP documentation of static keywords does not unambiguously explain behavior of static variables inside methods in example #1. I believe that in example #1 the exactly same instance of function (method) is used irregarding of how you call it (X::test() or Y::test()), therefore I would expect the same static var to be involved in both calls to test(). Is there anybody who can comment on this matter? Thanks. 6 июля 2011 г. 11:05 пользователь Andrew Williams andrew4willi...@gmail.com написал: 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 Дмитрий Степанов dmit...@stepanov.lv 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. -- Dmitry Stepanov E-mail: dmit...@stepanov.lv Home: http://www.stepanov.lv Skype: ninzjoo -- Dmitry Stepanov E-mail: dmit...@stepanov.lv Home: http://www.stepanov.lv Skype: ninzjoo
Re: [PHP] static variables inside static methods
2011/7/6 Дмитрий Степанов dmit...@stepanov.lv PHP documentation of static keywords does not unambiguously explain behavior of static variables inside methods in example #1. I believe that in example #1 the exactly same instance of function (method) is used irregarding of how you call it (X::test() or Y::test()), therefore I would expect the same static var to be involved in both calls to test(). I would also expect a static local variable to be tied to the function that defines it without regard to how you call it should the function happen to be static. To me, a static local variable should act like a private global variable and have exactly one value visible only to its declaring function. David