Edit report at https://bugs.php.net/bug.php?id=64963&edit=1
ID: 64963 Comment by: david at mouf-php dot com Reported by: alasdair at softhome dot net Summary: ReflectionClass::getMethods does not identify traits Status: Feedback Type: Bug Package: Reflection related Operating System: Debian Wheezy PHP Version: 5.4.15 Block user comment: N Private report: N New Comment: I have a very strong feeling about this. I understand that the PHP implementation of traits is about copying traits into classes. Yet, the whole purpose of a Reflection API is to find where properties / methods are declared. I have a simple question: I need to be able to find in which class/trait a method is declared. I need this for my PHP framework (Mouf), that is heavily relying in reflection to build a graphical dependency injection system. I've written a lengthy blog post explaining what the problems with the current Reflection API are, and hopefully, how to find a (not perfect) work around. You can find the blog post here: http://mouf-php.com/blog/php_reflection_api_traits I really hope we can agree this is indeed something that needs to be fixed, as the workaround I've put in place are far from perfect. For technical details, my PHP version: PHP 5.4.9-4ubuntu2.1. Previous Comments: ------------------------------------------------------------------------ [2013-06-03 17:26:15] alasdair at softhome dot net In that case should there not be some kind of isTrait for the ReflectionMethod the same way there is for the ReflectionClass? ------------------------------------------------------------------------ [2013-06-03 16:27:04] larue...@php.net the methods of traits are copied into class. so, in theory, there is nothing wrong. ------------------------------------------------------------------------ [2013-06-03 13:57:33] alasdair at softhome dot net Description: ------------ Specific PHP version PHP 5.4.15-1~dotdeb.2 Executing ReflectionClass::getMethods on a class using traits does not differentiate between methods within the class or methods within the trait being used, whereas calling ReflectionMethod::getDeclaringClass on the class with the method identifies it as coming from the trait. Test script: --------------- <?php trait t { function f() { //do stuff } } Class c { use t; function f2() { //do stuff } } $class = new ReflectionClass('c'); print_r($class->getMethods()); ?> Expected result: ---------------- Array ( [0] => ReflectionMethod Object ( [name] => f2 [class] => c ) [1] => ReflectionMethod Object ( [name] => f [class] => t ) ) or Array ( [0] => ReflectionMethod Object ( [name] => f2 [class] => c ) [1] => ReflectionMethod Object ( [name] => f [trait] => t ) ) Actual result: -------------- Array ( [0] => ReflectionMethod Object ( [name] => f2 [class] => c ) [1] => ReflectionMethod Object ( [name] => f [class] => c ) ) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=64963&edit=1