I've been looking at the php reflection methods, what i want to do is inject some code after the method is opened and before any return value, for example i want to change:
function foo($bar)
{
$foo = $bar ;
return $foo ;
}
And inject some code into it like:
function foo($bar)
{
//some code here
$foo = $bar ;
//some code here
return $foo ;
}
possible?
Just an idea:
You could add a special autoloader before the original autoloader, read the file that your original autoload would load, change the content, save that file somewhere else (some tmp dir for example) and include that modified file instead of the original one.
I wanted to do the exact same thing, so I created a generic instrumentation class that would replace the class I was trying to instrument and leveraging @ircmaxell technique it would call through to the class to be instrumented.
Say you had an instance of a class like
$myClass
, that had functionfoo
on it, then you would do something like this:Calling
$myClass->foo($bar)
would work the same (with the same caveats as @ircmaxell answer) if$instrumentationOn
istrue
orfalse
. If it istrue
it would just do the extra timing stuff.Well, one way, would be to make all the method calls "virtual":
PHP 5.2:
PHP 5.3:
All PHP:
It passes the instance of the object as the first method to the "override". Note: This "overriden" method will not have access to any protected members of the class. So use getters (
__get
,__set
). It WILL have access to protected methods, since the actual call is coming from__call()
...Note: You'll need to modify all your default methods to be prefixed with an '_' for this to work... (or you can chose another prefix option, or you can just scope them all protected)...
Maybe I'm missing something, but do you really want to "inject" code as you say? What are you trying to achieve? If you simply want to execute one block of code when A happens, and another when B happens, then all you need is simple programming logic, like an if() statement.
Are you really trying to alter a function at runtime? Or is this just a logic problem?
Be more specific about what you need to do.
Look into anonymous functions. If you can run PHP 5.3 that might be more along the lines of what you're trying to do.