Переход на PHP 5.3 ошибки в Joomla 1.5
Вчера столкнулся с проблеммой: хостер перешел на более новую версию РНР 5.3, в результате чего на сайте (cms Joomla 1.5) перестали работать менюшки. Выдавало ошибку в функции call_user_func_array что-то вроде того что ожидается в качестве параметра ссылка. Ну сначала поругался с хостерами и хотел уже переходить на другой хостинг, а потом решил все же покопаться в коде. И как ни странно проблему смог устранить.
Начну по порядку. Зашел на ua.php.net и там прямым текстом сказано:
"Поведение функций при передаче параметров по значению, в которых параметры передаются по ссылке, было изменено. Там, где прежде функция принимала параметр по значению, сейчас генерируется фатальная ошибка. Любой прежний код, который передает константы или значения в качестве параметров функциям, которые ожидают ссылки, необходимо будет изменить, чтобы присвоить значение переменной перед вызовом функции."
В общем читал я читал этот обзац несколько раз... вроде бы все понятно, но как это сделать непонятно. Начал гуглить... и нагуглил таки ответ (спустя несколько проб и ошибок)
В общем вот решение:
function makeValuesReferenced($arr){
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
либо если не удается подставить это через функцию (у меня такое тоже встречалось) то просто можно переделать сам код программы примерно так:
$refs = array();
foreach($args as $key => $value)
$refs[$key] = &$args[$key];
call_user_func_array($callback, $refs);
Вот и все. Теперь старая джумла работает. Но конечно все равно это костыли и надо переходить похоже на более свежую версию 2.5
Если есть вопросы, чем смогу - помогу. Задавайте в комментариях.
Начну по порядку. Зашел на ua.php.net и там прямым текстом сказано:
"Поведение функций при передаче параметров по значению, в которых параметры передаются по ссылке, было изменено. Там, где прежде функция принимала параметр по значению, сейчас генерируется фатальная ошибка. Любой прежний код, который передает константы или значения в качестве параметров функциям, которые ожидают ссылки, необходимо будет изменить, чтобы присвоить значение переменной перед вызовом функции."
В общем читал я читал этот обзац несколько раз... вроде бы все понятно, но как это сделать непонятно. Начал гуглить... и нагуглил таки ответ (спустя несколько проб и ошибок)
В общем вот решение:
call_user_func_array($callback, makeValuesReferenced($args));
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
либо если не удается подставить это через функцию (у меня такое тоже встречалось) то просто можно переделать сам код программы примерно так:
$refs = array();
foreach($args as $key => $value)
$refs[$key] = &$args[$key];
call_user_func_array($callback, $refs);
Вот и все. Теперь старая джумла работает. Но конечно все равно это костыли и надо переходить похоже на более свежую версию 2.5
Если есть вопросы, чем смогу - помогу. Задавайте в комментариях.
Comments