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

Мой хост вдруг что-то изменил, и теперь мои сайты (большинство wp - около 100) получают печально известную ошибку Invalid opcode 153/1/8

Линии, ответственные за это:

$f = function() use ($out) {
    echo $out;
};

После 2 минут исследования выясняется, что виновником является eAccelerator, который не поддерживает анонимные функции

Оба следующих вопроса также обвинили ошибку в eAccelerator:

Неверный OpCode и функция сортировки php,

/questions/33128855/problemyi-pri-ispolzovanii-funktsii-obratnogo-vyizova-v-php/33128867#33128867

Забавный факт: тот же код уже был перед темой моих 2 вопросов здесь, на SE и здесь, где я столкнулся с проблемой при использовании анонимных функций с более старыми версиями 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);
Другие вопросы по тегам