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

Reply via email to