Мой хост вдруг изменил что-то, и теперь мои сайты (большинство wp — около 100) получают печально известную ошибку Invalid opcode 153/1/8
Линии, ответственные за это:
$f = function() use ($out) {
echo $out;
};
После 2 минут исследования выясняется, что виновником является eAccelerator, который не поддерживает анонимные функции
Оба следующих вопроса также обвинили ошибку в eAccelerator:
Неверный OpCode и функция сортировки php,
https://stackoverflow.com/a/12085901/1244126
Забавный факт: тот же код был уже перед темой моих собственных 2 вопросов здесь на ЮВ а также Вот , где я столкнулся с проблемой при использовании
анонимные функции со старыми версиями PHP ( < 5.3) с create_function
$f = create_function(' $out ',' global $out; echo $out;');
Итак, мой вопрос : как я могу изменить свой код таким образом, чтобы избежать ошибки eAccelerator И будет работать на всех версиях php. (вряд ли я смогу убедить своего хозяина что-то изменить на его стороне)
РЕДАКТИРОВАТЬ I:
Для ясности (хотя это может быть немного неактуально — вопрос в том, как использовать перекрестно совместимые анонимные функции) — я публикую весь соответствующий код …
if ( count( $content_widget ) > 0 ) { // avoid error when no widget...
$i=0;
foreach ( $content_widget as $wid ){
$out = null;
$i++;
$widg_id = 'o99_dashboard_widget_dyn_' . $i;
$widg_name = 'widget name - ' . $i;
$out = $wid;
// $f = create_function('$out','global $out;echo $out;');
// $f = create_function('', 'global $out; echo $out ;');
$f = function() use ($out) {
echo $out;
};
// function() use ($out) // NOPE
// $f = $f($out); // NOPE again
wp_add_dashboard_widget($widg_id, $widg_name, $f);
// $i++;
}
}
Это просто простой код для динамического создания виджетов панели мониторинга в области wp admin.
Кажется, что они используют call_user_func
Таким образом, вы можете создать новый объект и передать вызываемый массив.
class s {
private $_out = null;
public function __construct($out){
$this->_out = $out;
}
public function a(){
echo $this->_out;
}
}
$function = array(new S('my out'), 'a');
var_dump(is_callable($function));
call_user_func($function);
Других решений пока нет …