Reflection API RFC

php.internals

Andrei Zmievski

23 years ago
I have the first draft of PHP 5 reflection API ready. You can find it at: http://www.gravitonic.com/software/php/reflection.txt Comments and suggestions are appreciated. -Andrei http://www.gravitonic.com/ "Beware of bugs in the above code; I have only proved it correct, not tried it." -- Donald Knuth

(Marcus Börger)

23 years ago
At 21:37 29.03.2003, Andrei Zmievski wrote:
>I have the first draft of PHP 5 reflection API ready. You can find it >at: > > http://www.gravitonic.com/software/php/reflection.txt > >Comments and suggestions are appreciated.
What about doing it with some interfaces? marcus

Andrei Zmievski

23 years ago
On Sat, 29 Mar 2003, Marcus Börger wrote:
> > http://www.gravitonic.com/software/php/reflection.txt > > > >Comments and suggestions are appreciated. > > > What about doing it with some interfaces?
Why? -Andrei http://www.gravitonic.com/ * Software never has bugs. It just develops random features. *

(Marcus Börger)

23 years ago
At 22:09 29.03.2003, Andrei Zmievski wrote:
>On Sat, 29 Mar 2003, Marcus Börger wrote: > > > http://www.gravitonic.com/software/php/reflection.txt > > > > > >Comments and suggestions are appreciated. > > > > > > What about doing it with some interfaces?
or an abstract base class because most methods are the same marcus

Andrei Zmievski

23 years ago
On Sat, 29 Mar 2003, Marcus Börger wrote:
> >> What about doing it with some interfaces? > > or an abstract base class because most methods are the same
Doing it just for the sake of interface or abstract classes doesn't seem prudent to me. So what if some methods are duplicated? -Andrei http://www.gravitonic.com/ As I was going up the stair, I met a man who wasn't there. He wasn't there again today. I wish, I wish he'd stay away. -Hughes Mearns

Andi Gutmans

23 years ago
At 04:19 PM 3/29/2003 -0500, Andrei Zmievski wrote:
>On Sat, 29 Mar 2003, Marcus Börger wrote: > > >> What about doing it with some interfaces? > > > > or an abstract base class because most methods are the same > >Doing it just for the sake of interface or abstract classes doesn't seem >prudent to me. So what if some methods are duplicated?
I agree with Andrei. Andi

Timm Friebe

23 years ago
On Sat, 2003-03-29 at 21:37, Andrei Zmievski wrote:
> I have the first draft of PHP 5 reflection API ready. You can find it > at: > > http://www.gravitonic.com/software/php/reflection.txt > > Comments and suggestions are appreciated.
* ClassType::getMethods([int flags]); I assume flags is a bitfield of private, public, protected, final and so on, defaulting to all of them? - Timm

Andrei Zmievski

23 years ago
On Sat, 29 Mar 2003, Timm Friebe wrote:
> > I have the first draft of PHP 5 reflection API ready. You can find it > > at: > > > > http://www.gravitonic.com/software/php/reflection.txt > > > > Comments and suggestions are appreciated. > > * ClassType::getMethods([int flags]); > > I assume flags is a bitfield of private, public, protected, final > and so on, defaulting to all of them?
Something like that. I haven't finalized what kind of method searching will be available. Perhaps one of the flags will be REGEXP with a optional argument specifying the regexp to match method name against. -Andrei http://www.gravitonic.com/ "Beware of bugs in the above code; I have only proved it correct, not tried it." -- Donald Knuth

Andi Gutmans

23 years ago
At 04:34 PM 3/29/2003 -0500, Andrei Zmievski wrote:
>On Sat, 29 Mar 2003, Timm Friebe wrote: > > > I have the first draft of PHP 5 reflection API ready. You can find it > > > at: > > > > > > http://www.gravitonic.com/software/php/reflection.txt > > > > > > Comments and suggestions are appreciated. > > > > * ClassType::getMethods([int flags]); > > > > I assume flags is a bitfield of private, public, protected, final > > and so on, defaulting to all of them? > >Something like that. I haven't finalized what kind of method searching >will be available. Perhaps one of the flags will be REGEXP with a >optional argument specifying the regexp to match method name against.
I would keep it simple. I don't see much use in regexp and I think if needed this is something to be done in user-land. Andi

Andrei Zmievski

23 years ago
On Sun, 30 Mar 2003, Andi Gutmans wrote:
> >Something like that. I haven't finalized what kind of method searching > >will be available. Perhaps one of the flags will be REGEXP with a > >optional argument specifying the regexp to match method name against. > > I would keep it simple. I don't see much use in regexp and I think if > needed this is something to be done in user-land.
Okay. One issue that I'm struggling with, though, is whether to roll the functionality of Zend built-in functions, such get_class(), get_class_methods(), etc, into the reflection API. Those function return simple strings or arrays and most of the time that is enough. Do you think we should have both ways of obtaining information in the new reflection API, getMethods() that will return an array of MethodTypes and something like getMethodsSimple() that will do what get_methods() does? -Andrei http://www.gravitonic.com/ * Anything will fit if you push hard enough. *

Andi Gutmans

23 years ago
At 10:42 AM 3/30/2003 -0500, Andrei Zmievski wrote:
>On Sun, 30 Mar 2003, Andi Gutmans wrote: > > >Something like that. I haven't finalized what kind of method searching > > >will be available. Perhaps one of the flags will be REGEXP with a > > >optional argument specifying the regexp to match method name against. > > > > I would keep it simple. I don't see much use in regexp and I think if > > needed this is something to be done in user-land. > >Okay. One issue that I'm struggling with, though, is whether to roll the >functionality of Zend built-in functions, such get_class(), >get_class_methods(), etc, into the reflection API. Those function return >simple strings or arrays and most of the time that is enough. Do you >think we should have both ways of obtaining information in the new >reflection API, getMethods() that will return an array of MethodTypes >and something like getMethodsSimple() that will do what get_methods() >does?
I think it should be getMethods() only which returns MethodTypes which in turn has invoke() and getName() methods.

Alan Knowles

23 years ago
A few more ideas for it:) - If you stored token start/end then you would be able to do getSource for function/method/class.. etc.. (which can do a load file/tokenizer and return implode('',array_range(starttoken,endtoken) - and add the generic methods loadTokens(); and freeTokens(); so that memory can be managed reasonably for them.. * it may also be better to store the token of the doc comment - On some of the pear classes the comment code is larger than the PHP code, and would be quite an overhead... - just make it throw an exception if you forgot to load the tokens for it.. - there appears to be no arguments array for methods/functions - not sure if extendsClass(), would be implemented by Implements?, and theres no getExtendsArray(), to return the tree of extends - constructors: - $classdetails = new ClassType('myclass'); $classdetails = new ClassType($this); rather than $classdetails = ClassType::fromName('myclass') $classdetails = ClassType::fromInstance('myclass') - I still think it would be nice to implement some of them as variables so that print_r($classdetails); would display some cute output... btw - It would also be nice to have unloadclass - so a) the codedoc generators - could load and free classes. b) php-gtk could reload modules rather than having to restart each time to test code.. Regards Alan Andrei Zmievski wrote:

Andrei Zmievski

23 years ago
On Sun, 30 Mar 2003, Alan Knowles wrote:
> - If you stored token start/end then you would be able to do getSource > for function/method/class.. etc.. (which can do a load file/tokenizer > and return implode('',array_range(starttoken,endtoken)
Keeping track of the tokens this way would require quite some code, I think.
> * it may also be better to store the token of the doc comment - On some > of the pear classes the comment code is larger than the PHP code, and > would be quite an overhead... - just make it throw an exception if you > forgot to load the tokens for it..
Hmm, I see the point, but is that really a problem? If a lot of people are worried about the overhead of storing doc comments, we could perhaps store only the starting/ending line of the comment and let the other tools extract them. But it means that the tools have to have access to the original source file - not really possible with 3rd party software distributed under an encoder, for example.
> - there appears to be no arguments array for methods/functions
No really good way of doing it with the current architecture. I defer to Andi/Zeev to see if it's possible to capture the declared parameters somehow..
> - not sure if extendsClass(), would be implemented by Implements?, and > theres no getExtendsArray(), to return the tree of extends
What would extendsClass() do?
> - constructors: - > $classdetails = new ClassType('myclass'); > $classdetails = new ClassType($this); > rather than > $classdetails = ClassType::fromName('myclass') > $classdetails = ClassType::fromInstance('myclass')
I'd rather avoid overloading. And in this case, these methods are basically factories.
> - I still think it would be nice to implement some of them as variables > so that > print_r($classdetails); would display some cute output...
We could always have toString() method for each one..
> btw - It would also be nice to have unloadclass - so > a) the codedoc generators - could load and free classes. > b) php-gtk could reload modules rather than having to restart each time > to test code..
What do you mean by unloadclass? -Andrei http://www.gravitonic.com/ "This isn't right. This isn't even wrong." -- Wolfgang Pauli

Sebastian Bergmann

23 years ago
Andrei Zmievski wrote:
> What do you mean by unloadclass?
I think what the name suggests: unload a class, ie. undeclare it.
-- Sebastian Bergmann http://sebastian-bergmann.de/ http://phpOpenTracker.de/ Did I help you? Consider a gift: http://wishlist.sebastian-bergmann.de/

Andi Gutmans

23 years ago
At 03:37 PM 3/29/2003 -0500, Andrei Zmievski wrote:
>I have the first draft of PHP 5 reflection API ready. You can find it >at: > > http://www.gravitonic.com/software/php/reflection.txt > >Comments and suggestions are appreciated.
By the way, I might have missed it,but maybe we should have a way to check if the method was defined in the specific class or if it is inherited. Andi

Jon Parise

23 years ago
On Sat, Mar 29, 2003 at 03:37:30PM -0500, Andrei Zmievski wrote:
> I have the first draft of PHP 5 reflection API ready. You can find it > at: > > http://www.gravitonic.com/software/php/reflection.txt > > Comments and suggestions are appreciated.
It would be cool if there was a way to get the (defined) set of parameters for a function / method. I'm going to assume that, because it's not included in your proposal, it's not currently possible given the current model, though.
-- Jon Parise (jon@php.net) :: The PHP Project (http://www.php.net/)

Andrei Zmievski

23 years ago
On Sun, 30 Mar 2003, Jon Parise wrote:
> It would be cool if there was a way to get the (defined) set of > parameters for a function / method. I'm going to assume that, because > it's not included in your proposal, it's not currently possible given > the current model, though.
Right. The engine would need to be modified in order to keep track of that. -Andrei http://www.gravitonic.com/ "Everything should be made as simple as possible, but not simpler." -- Albert Einstein