Переименование функций во время выполнения в PHP - PullRequest
8 голосов
/ 17 мая 2010

В PHP 5.3 есть способ переименовать функцию или «перехватить» функцию.

В «APD» есть rename_function(), который был нарушен с ~ 2004 года. Если вы попытаетесь построить его на PHP 5.3, вы получите эту ошибку:

'struct _zend_compiler_globals' has no member named 'extended_info'

Это действительно легко исправить, просто измените эту строку:

GC(extended_info) = 1;

до

CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;

Я изменил свой php.ini, и APD появляется в моем phpinfo (), как и должно быть. Однако, когда я звоню rename_function(), страница PHP не загружается, и я получаю ошибку сегментации в моем /var/log/apache2/error.log.

Есть ли способ исправить APD для работы с современной версией PHP? Или есть другой способ переименовать функции? С какой стати жизненно важная особенность не в php! ??!?! (Должен любить python:)

Ответы [ 3 ]

2 голосов
/ 26 мая 2012

Я понимаю, что этот вопрос немного устарел, но недавно я искал способ переименовать функции для тестирования и столкнулся с аналогичными трудностями с APD.

Наконец-то нажал на правильный запрос Google и нашел другой вариант: расширение test_helpers * Себастьяна Бергмана - у него есть собственный rename_function(), который, кажется, прекрасно работает, а также некоторые другие удобные помощники для перехвата и насмешливые вещи.

Бонус - относительно безболезненный процесс установки:

$ pear channel-discover pear.phpunit.de
$ pecl install phpunit/test_helpers

А затем добавьте extension=test_helpers.so к вашему php.ini

2 голосов
/ 09 сентября 2012

Современное расширение runkit можно найти на http://github.com/zenovich/runkit Он поддерживает все современные версии PHP, выпущенные на данный момент (от 4.4 до 5.4+). Этот runkit является официальным и поддерживается.

С уважением, Дмитрий Зенович

2 голосов
/ 17 мая 2010

Магистраль Runkit совместима с 5.3+.

svn checkout http://svn.php.net/repository/pecl/runkit/trunk runkit
cd runkit
phpize
./configure
make && make install

Добавить расширение = runkit.so в php.ini (или runkit.ini в conf.d)

Чтобы использовать runkit_function_rename(), вам также придется перекомпилировать php с флагом конфигурации --enable-maintainer-zts. (Черт возьми, зенд!)

...