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>