Короче говоря, я работаю с устаревшей кодовой базой, которая сильно использует встроенную функцию PHP call_user_func_array. Я пытаюсь заставить его работать с PHP 5.3 (обновление с 5.2), но столкнулись с проблемой, описанной здесь (в разделе «Передача не-массивы»):Могу ли я расширить встроенную функцию PHP?
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
функции.
Возможно ли это, и если да, то каким образом?
Поскольку код не соответствует документированному API, он по существу сломан, вам нужно будет исправить каждый экземпляр этой функции в какой-то момент, а не накладывать патчи на исправления. Я вижу, что вам может понадобиться временное обходное решение, так что +1 в любом случае. :) – deceze
возможно дубликат http://stackoverflow.com/questions/4725194/php-override-existing-function – Nazariy
@Nazariy - этот поток не занимается сохранением старой функции.Внимательно прочитайте вопрос OP. –