Можно ли расширить встроенную функцию 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 ответа:
Вы можете использовать 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);}