Неверный код операции 153/1/8 при использовании анонимной функции

Мой хост вдруг изменил что-то, и теперь мои сайты (большинство 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.

1

Решение

Кажется, что они используют 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);
0

Другие решения

Других решений пока нет …