|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-11-07 13:19 UTC] 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"
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Nov 07 08:00:02 2025 UTC |
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"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.