Edit report at https://bugs.php.net/bug.php?id=63454&edit=1
ID: 63454
Comment by: zetruger at gmail dot com
Reported by: zetruger at gmail dot com
Summary: Inheriting static function with static variable
defined in a trait.
Status: Open
Type: Feature/Change Request
Package: Class/Object related
Operating System: Xubuntu 12.04
PHP Version: 5.4.8
Block user comment: N
Private report: N
New Comment:
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.
Previous Comments:
------------------------------------------------------------------------
[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] [email protected]
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"
------------------------------------------------------------------------
[2012-11-07 13:19:03] zetruger at gmail dot com
Description:
------------
There is a difference between inheriting static function with static variable
defined in a trait of a base class and the same function defined in a base
class
directly.
Test script:
---------------
<?php
trait Foo {
static public function theSameFunc() {
static $var = NULL;
if (is_null($var)) $var = get_called_class();
return $var;
}
}
class A {
use Foo;
//static public function theSameFunc() {
// static $var = NULL;
// if (is_null($var)) $var = get_called_class();
// return $var;
//}
}
class B extends A {}
class C extends B {}
var_dump(A::theSameFunc());
var_dump(B::theSameFunc());
var_dump(C::theSameFunc());
class D extends C {}
class E extends D {}
class F extends E {}
var_dump(D::theSameFunc());
var_dump(E::theSameFunc());
var_dump(F::theSameFunc());
?>
Expected result:
----------------
string(1) "A"
string(1) "B"
string(1) "C"
string(1) "D"
string(1) "E"
string(1) "F"
Actual result:
--------------
string(1) "A"
string(1) "B"
string(1) "C"
string(1) "C"
string(1) "C"
string(1) "C"
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=63454&edit=1