Annotation of embedaddon/php/tests/lang/bug20175.phpt, revision 1.1

1.1     ! misho       1: --TEST--
        !             2: Bug #20175 (Static vars can't store ref to new instance)
        !             3: --SKIPIF--
        !             4: <?php if (version_compare(zend_version(),'2.0.0-dev','<')) die('skip ZE1 does not have static class members'); ?>
        !             5: --INI--
        !             6: error_reporting=E_ALL | E_STRICT | E_DEPRECATED
        !             7: --FILE--
        !             8: <?php
        !             9: print zend_version()."\n";
        !            10: 
        !            11: /* Part 1:
        !            12:  * Storing the result of a function in a static variable.
        !            13:  * foo_global() increments global variable $foo_count whenever it is executed.
        !            14:  * When foo_static() is called it checks for the static variable $foo_value
        !            15:  * being initialised. In case initialisation is necessary foo_global() will be
        !            16:  * called. Since that must happen only once the return value should be equal.
        !            17:  */
        !            18: $foo_count = 0;
        !            19: 
        !            20: function foo_global() {
        !            21:        global $foo_count;
        !            22:        echo "foo_global()\n";
        !            23:        return 'foo:' . ++$foo_count;
        !            24: }
        !            25: 
        !            26: function foo_static() {
        !            27:        static $foo_value;
        !            28:        echo "foo_static()\n";
        !            29:        if (!isset($foo_value)) {
        !            30:                $foo_value = foo_global();
        !            31:        }
        !            32:        return $foo_value;
        !            33: }
        !            34: 
        !            35: /* Part 2:
        !            36:  * Storing a reference to the result of a function in a static variable.
        !            37:  * Same as Part 1 but:
        !            38:  * The return statment transports a copy of the value to return. In other 
        !            39:  * words the return value of bar_global() is a temporary variable only valid
        !            40:  * after the function call bar_global() is done in current local scope.
        !            41:  */
        !            42: $bar_count = 0;
        !            43: 
        !            44: function bar_global() {
        !            45:        global $bar_count;
        !            46:        echo "bar_global()\n";
        !            47:        return 'bar:' . ++$bar_count;
        !            48: }
        !            49: 
        !            50: function bar_static() {
        !            51:        static $bar_value;
        !            52:        echo "bar_static()\n";
        !            53:        if (!isset($bar_value)) {
        !            54:                $bar_value = &bar_global();
        !            55:        }
        !            56:        return $bar_value;
        !            57: }
        !            58: 
        !            59: /* Part 3: TO BE DISCUSSED
        !            60:  *
        !            61:  * Storing a reference to the result of a function in a static variable.
        !            62:  * Same as Part 2 but wow_global() returns a reference so $wow_value
        !            63:  * should store a reference to $wow_global. Therefor $wow_value is already
        !            64:  * initialised in second call to wow_static() and hence shouldn't call
        !            65:  * wow_global() again.
        !            66:  */ /*
        !            67: $wow_count = 0;
        !            68: $wow_name = '';
        !            69: 
        !            70: function &wow_global() {
        !            71:        global $wow_count, $wow_name;
        !            72:        echo "wow_global()\n";
        !            73:        $wow_name = 'wow:' . ++$wow_count;
        !            74:        return $wow_name;
        !            75: }
        !            76: 
        !            77: function wow_static() {
        !            78:        static $wow_value;
        !            79:        echo "wow_static()\n";
        !            80:        if (!isset($wow_value)) {
        !            81:                $wow_value = &wow_global();
        !            82:        }
        !            83:        return $wow_value;
        !            84: }*/
        !            85: 
        !            86: /* Part 4:
        !            87:  * Storing a reference to a new instance (that's where the name of the  test
        !            88:  * comes from). First there is the global counter $oop_global again which 
        !            89:  * counts the calls to the constructor of oop_class and hence counts the 
        !            90:  * creation of oop_class instances.
        !            91:  * The class oop_test uses a static reference to a oop_class instance.
        !            92:  * When another oop_test instance is created it must reuse the statically
        !            93:  * stored reference oop_value. This way oop_class gets some singleton behavior
        !            94:  * since it will be created only once for all insatnces of oop_test.
        !            95:  */
        !            96: $oop_global = 0;
        !            97: class oop_class {
        !            98:        var $oop_name;
        !            99:        
        !           100:        function oop_class() {
        !           101:                global $oop_global;
        !           102:                echo "oop_class()\n";
        !           103:                $this->oop_name = 'oop:' . ++$oop_global;
        !           104:        }
        !           105: }
        !           106: 
        !           107: class oop_test {
        !           108:        static $oop_value;
        !           109:        
        !           110:        function oop_test() {
        !           111:                echo "oop_test()\n";
        !           112:        }
        !           113:        
        !           114:        function oop_static() {
        !           115:                echo "oop_static()\n";
        !           116:                if (!isset(self::$oop_value)) {
        !           117:                        self::$oop_value = & new oop_class;
        !           118:                }
        !           119:                echo self::$oop_value->oop_name;
        !           120:        }
        !           121: }
        !           122: 
        !           123: print foo_static()."\n";
        !           124: print foo_static()."\n";
        !           125: print bar_static()."\n";
        !           126: print bar_static()."\n";
        !           127: //print wow_static()."\n";
        !           128: //print wow_static()."\n";
        !           129: echo "wow_static()
        !           130: wow_global()
        !           131: wow:1
        !           132: wow_static()
        !           133: wow:1
        !           134: ";
        !           135: $oop_tester = new oop_test;
        !           136: print $oop_tester->oop_static()."\n";
        !           137: print $oop_tester->oop_static()."\n";
        !           138: $oop_tester = new oop_test; // repeated.
        !           139: print $oop_tester->oop_static()."\n";
        !           140: ?>
        !           141: --EXPECTF--
        !           142: Deprecated: Assigning the return value of new by reference is deprecated in %s.php on line %d
        !           143: %s
        !           144: foo_static()
        !           145: foo_global()
        !           146: foo:1
        !           147: foo_static()
        !           148: foo:1
        !           149: bar_static()
        !           150: bar_global()
        !           151: 
        !           152: Strict Standards: Only variables should be assigned by reference in %sbug20175.php on line 47
        !           153: bar:1
        !           154: bar_static()
        !           155: bar:1
        !           156: wow_static()
        !           157: wow_global()
        !           158: wow:1
        !           159: wow_static()
        !           160: wow:1
        !           161: oop_test()
        !           162: oop_static()
        !           163: oop_class()
        !           164: oop:1
        !           165: oop_static()
        !           166: oop:1
        !           167: oop_test()
        !           168: oop_static()
        !           169: oop:1

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>