Renaming Functions during runtime in PHP
In PHP 5.3 is there a way to rename a function or "hook" a function.
There is the rename_function()
within "APD" which has been broken since ~200开发者_JAVA百科4. If you try and build it on PHP 5.3 you'll get this error:
'struct _zend_compiler_globals' has no member named 'extended_info'
This is a really easy error to fix, just change this line:
GC(extended_info) = 1;
to
CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
I modified my php.ini and the APD shows up in my phpinfo() as it should. However when i call rename_function()
the PHP page doesn't load and I get a segmentation fault in my /var/log/apache2/error.log
.
Is there anyway to fix APD to work with a modern version of PHP? Or is there another method to rename functions? Why on earth is vital feature not in php!??!?! (Gotta love python :)
The up-to-date runkit extension can be found on http://github.com/zenovich/runkit It supports all contemporary versions of PHP released for the time being (from 4.4 to 5.4+). This runkit is official and supported.
Sincerely, Dmitry Zenovich
Runkit trunk is 5.3+ compatible.
svn checkout http://svn.php.net/repository/pecl/runkit/trunk runkit cd runkit phpize ./configure make && make install
Add extension=runkit.so to php.ini (or runkit.ini in conf.d)
In order to use runkit_function_rename()
you will also have to recompile php with the --enable-maintainer-zts
configuration flag. (Damn you zend!)
I realize this question is a bit old, but I was recently looking for a way to rename functions for testing and ran into similar difficulties with APD.
Finally hit on the right Google query and found another option: Sebastian Bergmann's test_helpers extension -- it has its own rename_function()
that seems to work just fine, as well as some other handy helpers for intercepting and mocking things.
Bonus - a relatively painless install process:
$ pear channel-discover pear.phpunit.de
$ pecl install phpunit/test_helpers
And then add extension=test_helpers.so
to your php.ini
精彩评论