2012-01-11 5 views
2

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

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

+2

Поскольку код не соответствует документированному API, он по существу сломан, вам нужно будет исправить каждый экземпляр этой функции в какой-то момент, а не накладывать патчи на исправления. Я вижу, что вам может понадобиться временное обходное решение, так что +1 в любом случае. :) – deceze

+0

возможно дубликат http://stackoverflow.com/questions/4725194/php-override-existing-function – Nazariy

+1

@Nazariy - этот поток не занимается сохранением старой функции.Внимательно прочитайте вопрос OP. –

ответ

5

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

Спасибо, это сработало, хотя я обнаружил, что мне нужно было указать новое определение функции, используя вызов 'override_function()' (передача исходного имени функции в качестве имени функции для переопределения). – aroth

1

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

... если вы используете rename_function для переименуйте исходную функцию в третье имя, затем вызовите третье имя в функции OVERRIDING, вы получите желаемый эффект:

rename_function ('strlen', 'new_strlen');

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

функция override_strlen ($ строка) { возврата new_strlen ($ строка);}

0

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

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

http://php.net/namespaces

+0

Это действительно не решает проблему, хотя ... – deceze

Смежные вопросы