Hi, marcus Thanks for the further investigation.
I later found my test doesn't do the same thing as the one supplied in #20175 (sorry for confusions), because if the referenced thing is virtually a kind of resource identifier (i.e. ZE2 spec), there must be no such problem. Anyway I think statics should be able to hold a referenced value. Won't it be fixed? Moriyoshi [EMAIL PROTECTED] (Marcus Boerger) wrote: > Attached you see it as a .phpt file (but where is the difference between > your ZE1/2 results). > > Part 2: bar_static() is the test that failed in bug20175 but > i think the way Zend Engine 1.1/2 do it now is correct because > they return copies. > Part 3: indeed seems to be an error. Because the manual says one > can return a reference but it shows you can't. > > =tests/lang/bug20175.phpt===== > --TEST-- > Bug #20175 (Static vars can't store ref to new instance) > --FILE-- > <?php > /* Part 1: > * Storing the result of a function in a static variable. > * foo_global() increments global variable $foo_count whenever it is executed. > * When foo_static() is called it checks for the static variable $foo_value > * being initialised. In case initialisation is necessary foo_global() will be > * called. Since that must happen only once the return value should be equal. > */ > $foo_count = 0; > > function foo_global() { > global $foo_count; > return 'foo:' . ++$foo_count; > } > > function foo_static() { > static $foo_value; > if (!isset($foo_value)) { > $foo_value = foo_global(); > } > return $foo_value; > } > > /* Part 2: > * Storing a reference to the result of a function in a static variable. > * Same as Part 1 but: > * The return statment transports a copy of the value to return. In other > * words the return value of bar_global() is a temporary variable only valid > * after the function call bar_global() is done in current local scope. > */ > $bar_global = 0; > > function bar_global() { > global $bar_count; > return 'bar:' . ++$bar_count; > } > > function bar_static() { > static $bar_value; > if (!isset($bar_value)) { > $bar_value = &bar_global(); > } > return $bar_value; > } > > /* Part 3: > * Storing a reference to the result of a function in a static variable. > * Same as Part 2 but wow_global() returns a reference. > */ > $wow_global = 0; > $wow_name = ''; > > function &wow_global() { > global $wow_count, $wow_name; > $wow_name = 'wow:' . ++$wow_count; > return $wow_name; > } > > function wow_static() { > static $wow_value; > if (!isset($wow_value)) { > $wow_value = &wow_global(); > } > return $wow_value; > } > > print zend_version()."\n"; > print foo_static()."\n"; > print foo_static()."\n"; > print bar_static()."\n"; > print bar_static()."\n"; > print wow_static()."\n"; > print wow_static()."\n"; > ?> > --EXPECTF-- > %s > foo:1 > foo:1 > bar:1 > bar:2 > wow:1 > wow:1 > =EOF============================== > > At 21:51 30.10.2002, Moriyoshi Koizumi wrote: > >I've simplified the test code, and I still have got a strange result > >with ZE2. > > > >------------------------------------------------------ > ><?php > > function foo() { > > static $value; > > if (!isset($value)) { > > $value = rand(0,100); > > } > > return $value; > > } > > > > function bar() { > > static $value; > > if (!isset($value)) { > > $value = &rand(0,100); > > } > > return $value; > > } > > > > print zend_version()."\n"; > > print foo()."\n"; > > print foo()."\n"; > > print bar()."\n"; > > print bar()."\n"; > >?> > >------------------------------------------------------ > > > >with ZE1 > >------------------------------------------------------ > >1.3.0 > >26 > >26 > >75 > >95 > >------------------------------------------------------ > > > >with ZE2 > >------------------------------------------------------ > >2.0.0-alpha3 > >34 > >34 > >29 > >92 > >------------------------------------------------------ > > > >Is this a known behaviour? > > > > > >Moriyoshi > > > >-- > >PHP Development Mailing List <http://www.php.net/> > >To unsubscribe, visit: http://www.php.net/unsub.php > > > -- > PHP Development Mailing List <http://www.php.net/> > To unsubscribe, visit: http://www.php.net/unsub.php > -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php