Bug #65039 [Opn->Nab]: wrong late static binding in traits
Edit report at https://bugs.php.net/bug.php?id=65039&edit=1
ID: 65039
Updated by: laruence@php.net
Reported by: easteregg at verfriemelt dot org
Summary: wrong late static binding in traits
-Status: Open
+Status: Not a bug
Type: Bug
Package: Scripting Engine problem
Operating System: Linux
PHP Version: 5.4.16
Block user comment: N
Private report: N
New Comment:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
see following example:
<?php
trait getObjectById {
public static $_cache = [];
public static function get($id,$autoload = true) {
if (!isset(static::$_cache[$id])) {
static::$_cache[$id] = new static($id, $autoload);
}
return static::$_cache[$id];
}
}
class User { use getObjectById; }
class User2 extends User {
public static $_cache = []; // difference here
}
//class User3 extends User { use getObjectById; }
// var_dump(User3::get(1)) would return the right object cause the trait is
overwritten
var_dump(User::get(1));
var_dump(User2::get(1));
~
Previous Comments:
------------------------------------------------------------------------
[2013-06-14 11:11:34] easteregg at verfriemelt dot org
Description:
------------
Hi
when i use a trait with late static bindings i get the wrong bindings, when i use
an object A with a trait T and then inherit this trait to a new object B and call
the trait T from within that object B, i will get an late binding to object A
instead of object B as expected
where as when use the traitmethod within the object A and inherit this for object
B and then call it, the static binding are bound to object b as expected
Test script:
---------------
<?php
trait getObjectById {
public static $_cache = [];
public static function get($id,$autoload = true) {
if (!isset(static::$_cache[$id])) {
static::$_cache[$id] = new static($id, $autoload);
}
return static::$_cache[$id];
}
}
class User { use getObjectById; }
class User2 extends User { }
//class User3 extends User { use getObjectById; }
// var_dump(User3::get(1)) would return the right object cause the trait is overwritten
var_dump(User::get(1));
var_dump(User2::get(1));
Expected result:
----------------
object(User)[1]
object(User2)[1]
Actual result:
--------------
object(User)[1]
object(User)[1]
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=65039&edit=1
Thread (2 messages)