Req #63454 [Com]: Inheriting static function with static variable defined in a trait.

From: Date: Sun, 25 Nov 2012 12:45:15 +0000
Subject: Req #63454 [Com]: Inheriting static function with static variable defined in a trait.
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-174926@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
 Comment by:         beatdrdre at hotmail 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:

Whereever we go,we always hope to get perfect things.<a href="http://www.cheap-beats-by-dre-sale-outlet.com/"><strong>beats
by dre sale</strong></a> is such a place that offer me good items.<a href="http://www.cheap-beats-by-dre-sale-outlet.com/"><strong>wholesale
beats by dre</strong></a> is quite good with the service.I like the <a href="http://www.cheap-beats-by-dre-sale-outlet.com/"><strong>beats
by dre outlet</strong></a>.So I want you can love it too.


Previous Comments:
------------------------------------------------------------------------
[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"

------------------------------------------------------------------------
[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


Thread (8 messages)

« previous php.bugs (#174926) next »