File:
[ELWIX - Embedded LightWeight unIX -] /
embedaddon /
php /
tests /
lang /
bug20175.phpt
Revision
1.1.1.1 (vendor branch):
download - view:
text,
annotated -
select for diffs -
revision graph
Tue Feb 21 23:48:06 2012 UTC (12 years, 8 months ago) by
misho
Branches:
php,
MAIN
CVS tags:
v5_4_3elwix,
v5_4_29p0,
v5_4_29,
v5_4_20p0,
v5_4_20,
v5_4_17p0,
v5_4_17,
v5_3_10,
HEAD
php
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>