|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #69180 Reflection does not honor trait conflict resolution / method aliasing
Submitted: 2015-03-04 08:05 UTC Modified: 2020-03-03 10:57 UTC
From: Assigned: nikic (profile)
Status: Closed Package: Reflection related
PHP Version: 5.6.6 OS: Irrelevant
Private report: No CVE-ID: None
 [2015-03-04 08:05 UTC]
The Reflection API does not honor the method aliasing / conflict resolution mechanism for traits.

Test script:
trait T1
    public function foo()

trait T2
    use T1 { foo as bar; }

    public function foo()

class C
    use T2;

$class = new ReflectionClass('C');

foreach ($class->getMethods() as $method) {

Expected result:
string(3) "bar"
string(3) "foo"

Actual result:
string(3) "foo"
string(3) "foo"


Add a Patch

Pull Requests

Pull requests:

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2015-06-02 13:35 UTC]
mmmm not easy.

This is because trait aliases are only resolved in a one-depth dimension.

If class Foo uses trait T1, class Foo will be assigned T1 as trait_aliases.
But if then T1 uses T2, Foo will not be assigned T2 as one of its own trait_aliases, T2 will be however a trait_alias of T1, as expected.

Reflection uses trait_aliases to get method names, thus this bug report.

This ugly patch ( changes that, and uses the hash_key that owns the resolved name directly, however, this is case insensitive, and thus breaks another test.

This is also a quick and dirty patch, I think we should rework the traits deeply, but that's not an easy task knowing how dirty they've been implemented :-(
 [2020-02-28 15:03 UTC]
-Status: Open +Status: Verified
 [2020-03-02 11:26 UTC]
-Assigned To: +Assigned To: nikic
 [2020-03-02 11:26 UTC]
I think the right way to fix this is to actually give aliased methods the right name, rather than trying to reverse-engineer it in various reflection APIs.

In principle this is possible, we just need to make the function name owned independently of the op array refcount. But making this work with opcache is not entirely simple.
 [2020-03-02 12:16 UTC]
The following pull request has been associated:

Patch Name: Fix bug #69180 (Reflection does not honor trait conflict resolution / method aliasing)
On GitHub:
 [2020-03-03 10:57 UTC]
-Status: Verified +Status: Closed
PHP Copyright © 2001-2023 The PHP Group
All rights reserved.
Last updated: Sun Oct 01 06:01:24 2023 UTC