Могу ли я расширить встроенную функцию PHP? - PullRequest
2 голосов
/ 11 января 2012

Короче говоря, я работаю с устаревшей кодовой базой, которая интенсивно использует встроенную в PHP call_user_func_array функцию.Я пытаюсь заставить его работать с PHP 5.3 (обновление с 5.2), но столкнулся с проблемой, описанной здесь (в разделе «Передача без массивов»):

http://sixohthree.com/1486/migrating-to-php-5-3-call_user_func_array

В двух словах, проблема в том, что между версиями PHP 5.2 и 5.3 поведение этой функции было изменено, так что она в основном ничего не делает и возвращает NULL, если второй параметр не является правильным массивом / объектом / ассоциативным массивом.5.2 не сделал этого, и поэтому кодовая база, с которой я работаю, не прилагает усилий к тому, чтобы передать параметр правильного типа.Это вызывает проблемы.

Чтобы исправить это, я мог бы следовать инструкциям в сообщении в блоге и выслеживать каждый отдельный вызов call_user_func_array в базе кода и исправлять их, но это было бы чрезвычайно утомительно.Кроме того, я заметил, что в PHP есть встроенный API-вызов override_function , который можно использовать для переопределения встроенных функций.Это удобно, но я хочу больше походить на расширение встроенной функции.

В идеале мне хотелось бы иметь возможность заменить реализацию call_user_func_array чем-то примерно таким:

function call_user_func_array($method, $params) {
    $params = is_array($params) ? $params : array($params);
    return old_call_user_func_array($method, $params);
}

... где old_call_user_func_array - встроеннаяcall_user_func_array функция.

Возможно ли это, и если да, то как?

Ответы [ 3 ]

5 голосов
/ 11 января 2012

Вы можете использовать rename_function , которая также входит в расширение APD, так что она должна быть у вас, если у вас установлена ​​override_function:

rename_function('call_user_func_array', 'old_user_func_array');

function call_user_func_array($method, $params) {
    $params = is_array($params) ? $params : array($params);
    old_call_user_func_array($method, $params);
}
1 голос
/ 11 января 2012

Привет, на ваш вопрос ответили в третьем или четвертом комментарии в онлайн-документации по PHP.Часто в разделе комментариев есть очень полезная информация и примеры (учтите, что есть кое-что, что явно неверно!) Я скопировал соответствующую часть здесь для вашего удобства:

... если вы используетеПереименуйте_функцию, чтобы переименовать исходную функцию в третье имя, а затем вызовите третье имя в функции ПЕРЕГРУЗКА, вы получите желаемый эффект:

Функция переименования ('strlen', 'new_strlen');

override_function ('strlen', '$ string', 'return override_strlen ($ string);');

функция override_strlen ($ string) {вернуть new_strlen ($ string);}

0 голосов
/ 11 января 2012

или вы можете поместить свой код в пространство имен:

namespace Phpoverride
{
    function call_user_func_array($method, $params) {
        return \call_user_func_array($method, $params);
    }
}

http://php.net/namespaces

...