web-dev-qa-db-ja.com

クラスメソッドを持つadd_actionが致命的なエラーを引き起こしている

これがPHPの問題(StackOverflowに適した)かWordPressの問題(StackExchangeに適した)かどうかはわかりませんでしたが、私の問題表示add_action()関数に含まれるため、ここに質問をしました。

これは同じ問題を引き起こすいくつかの単純化されたコードです(私の数百行のプラグインを再投稿するのを避けるため):

<?php
$class = new MyClass();
add_action('init', array($class, 'init'));

class MyClass {
    public static function init() {
        $this->core();
    }
    public static function core() {
        echo "I never get this far...";
    }
}
?>

次のようなエラーが表示されます。

致命的なエラー/home/coupon/public_html/wp-content/plugins/test.php内のオブジェクトコンテキストにないときに$ thisを使用する7

私のadd_action()呼び出しが代わりにそうであったならば:

add_action('init', 'MyClass::init');

それから私はこのエラーを理解するでしょう($thisのために関数が静的に呼ばれ、DEMenuのインスタンスが存在しないので)、しかし私が配列を使用しそしてクラスのインスタンスを渡したのでなぜこれが起こっているのかわかりません。

私の特定の問題は実際にこの問題に関連しています。私はカスタムWalkerクラスを作成してからwp_nav_menu_argsフィルタを使用してカスタムWalkerを渡しました。このエラーは185行目のclass-wp-walker.phpで表示されます。特に行があります:

$id_field = $this->db_fields['id'];

何か案は?

編集 -

test.phpは現在正しく機能していますが、元の問題は解決されていません...そのようなものとして、私のプラグインのindex.phpファイル(単純化されたもの)があります。

$DEMenu = new DEMenu();

class DEMenu {

    function DEMenu() {
        if (is_admin()) {
            add_action('admin_menu', array(&$this, 'admin'));
        } else {
            add_action('init', array(&$this, 'core'));
        }
    }

    public function admin() {
        /* Not important */
    }

    public function core() {
        add_filter('wp_nav_menu_args', array(&$this, 'add_walker'));
    }

    public function add_walker( $args ) {
        $args['walker'] = 'DEMenu_Walker';
        return $args;
    }

}

class DEMenu_Walker extends Walker_Nav_Menu {

    function __construct() {
        die("We made it to the constructor!");
    }

}

上記のように、次のようなエラーが表示されます。

致命的なエラー187/home/coupon/public_html/wp-includes/class-wp-walker.php内のオブジェクトコンテキストにないときに$ thisを使う_

上記のtest.phpは失敗していたので、そしてWalker_Nav_Menuクラスは通常このエラーを決して持ちませんでしたので(私がプラグインを追加するまではそうではありませんでした)私は問題が私のadd_action()またはadd_filter()呼び出しの1つにあると思いました。それでもまだ失敗しているので、私は問題がどこにあるのか完全にはわからない...

最終編集 -

walk_nav_menu_tree()関数を注意深く読み直すと、私はwalkerクラスで問題を発見しました...

function walk_nav_menu_tree( $items, $depth, $r ) {
        $walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;
        $args = array( $items, $depth, $r );

        return call_user_func_array( array(&$walker, 'walk'), $args );
}

$walker$r->walkerに設定されているので、クラスのインスタンスではなく文字列です。したがって、クラスメソッドはクラスのインスタンスを介する代わりに静的に呼び出されます。の代わりに:

$args['walker'] = 'DEMenu_Walker';

私が持っている必要があります:

$args['walker'] = new DEMenu_Walker();

タスク$this変数が壊れないように、WordPressプラグインのフックとしてクラスメソッドを呼び出します

4
stevendesu

試してください:

<?php
$class = new MyClass();

class MyClass {
    public function MyClass() {
       add_action('init', array($this, 'core'));
    }
    public static function core() {
        echo "I never get to here";
    }
}
?>
4
Andre
$class = new MyClass();
add_action('init', array($class, 'init'));

それは正しいです!あなたはPHPエラーを持っています、あなたはあなたのクラスにコンストラクタを追加しなければなりません "Instance/Object"のように:

class MyClass {
    function __construct() {
        return $this;
    }

    /* The other Methods... */
}
1
Adrian Preuß

静的クラスとメソッドを扱う場合

class Kc_Class{

  static function init(){

      add_action('some_hook',array(__CLASS__,'my_static_method'));

  }    
  static function my_static_method(){

    ...
  }
}

それからinitメソッドを呼び出します。

Kc_Class::init();
0
Dipesh KC