1

私のホストは突然何かを変更し、現在私のサイト (ほとんどの wp - 約 100) は悪名高いエラーを取得しています。Invalid opcode 153/1/8

それを担当する行:

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

2 分間の調査の後、犯人は匿名関数をサポートしていないeAccelerator であることがわかりました。

次の両方の質問は、eAccelerator のエラーも原因としています。

OpCode と PHP のソート機能を無効にします。

https://stackoverflow.com/a/12085901/1244126

楽しい事実: 同じコードは、 SEここで私自身の 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 管理エリアでダッシュボード ウィジェットを動的に作成する単純なコードです。

4

1 に答える 1

0

彼らは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);
于 2015-01-21T09:21:10.617 に答える