Req #34421 [Opn->Csd]: get_class and debug_backtrace report wrong class for inherited static methods
| From: | nikic@php.net | Date: | Sun, 16 Oct 2016 12:17:13 +0000 |
| Subject: | Req #34421 [Opn->Csd]: get_class and debug_backtrace report wrong class for inherited static methods | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-204829@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=34421&edit=1
ID: 34421
Updated by: nikic@php.net
Reported by: wkonkel at gmail dot com
Summary: get_class and debug_backtrace report wrong class for
inherited static methods
-Status: Open
+Status: Closed
Type: Feature/Change Request
-Package: Feature/Change Request
+Package: *General Issues
Operating System: redhat
PHP Version: 5.0.5
-Assigned To:
+Assigned To: nikic
Block user comment: N
Private report: N
New Comment:
This should be resolved as of PHP 5.3 with the introduction of late static binding. In particular
get_class() would be get_called_class() or something involving "static".
Previous Comments:
------------------------------------------------------------------------
[2005-12-22 12:05:26] thomas at gielfeldt dot dk
a grammatical correction: "hoping it would be" = "hoping it will be"
:-)
/Thomas
------------------------------------------------------------------------
[2005-12-22 10:42:15] thomas at gielfeldt dot dk
Hi
I've mailed the patch to the internals mailing list, hoping it would be taken into
consideration.
two new functions have been added: get_scope() and is_static().
Example of solution to the above code after patching:
<?
class baseClass {
static function do_get_scope() {
return get_scope();
}
static function do_backtrace() {
$backtrace = debug_backtrace();
return $backtrace[0]['scope'];
}
}
class extendedBaseClass extends baseClass {
}
echo extendedBaseClass::do_get_scope() . "<br>";
echo extendedBaseClass::do_backtrace() . "<br>";
?>
Expected result:
----------------
extendedBaseClass
extendedBaseClass
Actual result:
--------------
extendedBaseClass
extendedBaseClass
------------------------------------------------------------------------
[2005-09-09 13:25:34] johannes@php.net
This is a limitation in the way the engine works and it
most likely won't change in the near future. See also
previous discussions about it.
http://zend.com/zend/week/week219.php#Heading5
------------------------------------------------------------------------
[2005-09-08 16:06:19] wkonkel at gmail dot com
Although this is how it currently does work, this is not logical. If I specify that the scope to be
"extendedBaseClass", then why is the scope "baseClass"? If this was not a
static method, calling get_class() would return "extendedBaseClass" because the object
simply isn't a "baseClass", it's an "extendedBaseClass". Static
methods are no different.
------------------------------------------------------------------------
[2005-09-08 09:34:30] wkonkel at gmail dot com
Description:
------------
When a static function is called in the scope of an extended class, the static function still thinks
it's being called in the scope of the base class.
I found a similar bug at http://bugs.php.net/bug.php?id=30828 which was fixed
in 5.0.5, but the problem still remains.
Reproduce code:
---------------
<?
class baseClass {
static function do_get_class() {
return get_class();
}
static function do_backtrace() {
$backtrace = debug_backtrace();
return $backtrace[0]['class'];
}
}
class extendedBaseClass extends baseClass {
}
echo extendedBaseClass::do_get_class() . "<br>";
echo extendedBaseClass::do_backtrace() . "<br>";
?>
Expected result:
----------------
extendedBaseClass
extendedBaseClass
Actual result:
--------------
baseClass
baseClass
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=34421&edit=1