Stefan,
I recently tried to finalize reflection support for traits. Given code
like
<?php
trait T1 {
public function t1() {}
public function ta() {}
}
trait T2 {
public function t1() {}
public function tb() {}
}
class C {
use T1, T2 {
T2::t1 insteadof T1;
T1::t1 as tc;
}
}
?>
Now I use reflection on this:
$rc = new ReflectionClass('C');
print_r($rc->getTraitAliases());
Array
(
[tc] => T1::t1
)
So far so nice but I'm missing the information where C::t1() is coming
from. In the reflection code I'm currently iterating over
ce->trait_aliases and can't find where I can get the information from.
Actually I'd be even interested in getting all important methods and
their origin. Stefan, do you know where I can find the information or
would we have to store it additionally?
johannes
Hi Johannes:
2011/7/25 Johannes Schlüter johannes@schlueters.de:
Now I use reflection on this:
$rc = new ReflectionClass('C');
print_r($rc->getTraitAliases());Array
(
[tc] => T1::t1
)
Great, that is nice.
So far so nice but I'm missing the information where C::t1() is coming
from. In the reflection code I'm currently iterating over
ce->trait_aliases and can't find where I can get the information from.
Actually I'd be even interested in getting all important methods and
their origin. Stefan, do you know where I can find the information or
would we have to store it additionally?
The functions do not store that information, so there are basically
only two approaches, I see:
Either, factoring out the code which is doing the flattening, conflict
resolution, and class composition into something which could be easily
shared by both the reflection and the engine, and then re-doing it on
demand in the reflection,
or we extend zend_function by an origin pointer.
Not sure what the better tradeoff is general memory overhead vs.
cache-able pay-as-you-go overhead.
Best regards
Stefan