Req #63454 [Opn->Csd]: Inheriting static function with static variable defined in a trait.

From: Date: Thu, 18 Feb 2021 11:06:58 +0000
Subject: Req #63454 [Opn->Csd]: Inheriting static function with static variable defined in a trait.
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-232239@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=63454&edit=1

 ID:                 63454
 Updated by:         nikic@php.net
 Reported by:        zetruger at gmail dot com
 Summary:            Inheriting static function with static variable
                     defined in a trait.
-Status:             Open
+Status:             Closed
 Type:               Feature/Change Request
 Package:            Class/Object related
 Operating System:   Xubuntu 12.04
 PHP Version:        5.4.8
-Assigned To:        
+Assigned To:        nikic
 Block user comment: N
 Private report:     N

 New Comment:

This issue is fixed in PHP 8.1 as a result of https://github.com/php/php-src/commit/5d160e309ed207e618d49029e51c9c2dc2c5e61c.


Previous Comments:
------------------------------------------------------------------------
[2014-06-06 09:30:41] requinix@php.net

Related To: Bug #67385

------------------------------------------------------------------------
[2012-11-07 20:16:31] zetruger at gmail dot com

I think static variables must be set to default value or nulled automaticly in 
the moment of defining their classes. It does not work with traits.

------------------------------------------------------------------------
[2012-11-07 19:19:18] mail+php at requinix dot net

Seems like a bug: the order of class declarations and var_dumps matters. With

class A { ... }
var_dump(A::theSameFunc());
class B extends A {}
class C extends B {}
class D extends C {}
class E extends D {}
class F extends E {}
var_dump(B::theSameFunc());
var_dump(C::theSameFunc());
var_dump(D::theSameFunc());
var_dump(E::theSameFunc());
var_dump(F::theSameFunc());

I get AAAAAA, but with

class A { ... }
class B extends A {}
class C extends B {}
class D extends C {}
var_dump(A::theSameFunc());
var_dump(B::theSameFunc());
var_dump(C::theSameFunc());
var_dump(D::theSameFunc());
class E extends D {}
class F extends E {}
var_dump(E::theSameFunc());
var_dump(F::theSameFunc());

I get ABCDDD.

------------------------------------------------------------------------
[2012-11-07 14:46:48] zetruger at gmail dot com

I suppose it's a bug isn't it?
Or is it normal behavior?

------------------------------------------------------------------------
[2012-11-07 14:32:24] laruence@php.net

it's not about triat, it's about run-time or compile-time.

the following script behavior the same as your test script:

<?php
function __autoload($ce) {
    eval(<<<'PHP'
class A {
    static public function theSameFunc() {
      static $var = NULL;
      if (is_null($var)) $var = get_called_class();
      return $var;
    }
}
PHP
);
}
var_dump(A::theSameFunc());
class B extends A {}
var_dump(B::theSameFunc());
?>

output:
string(1) "A"
string(1) "A"

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=63454


--
Edit this bug report at https://bugs.php.net/bug.php?id=63454&edit=1


Thread (8 messages)

« previous php.bugs (#232239) next »