Можно ли расширить встроенную функцию PHP?


Короче говоря, я работаю с устаревшей кодовой базой, которая интенсивно использует встроенную в 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 bevavior этой функции был изменен так, что он в основном ничего не делает и возвращает 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 2

3 ответа:

Вы можете использовать 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);
}

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

... если вы используете rename_function для переименования исходной функции в третье имя, а затем вызываете третье имя в ПЕРЕОПРЕДЕЛЯЮЩЕЙ функции, вы получите желаемое эффект:

Rename_function ('strlen', 'new_strlen');

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

Функция override_strlen($string){ возвращает new_strlen ($string);}

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

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

Http://php.net/namespaces