使用类方法的ADD_ACTION导致致命错误

时间:2011-07-29 作者:stevendesu

我不确定这是一个PHP问题(适用于StackOverflow)还是WordPress问题(适用于StackExchange),但是自从我的问题appearsadd_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...";
    }
}
?>
我得到以下错误:

Fatal error: 在中不在对象上下文中使用$this/home/coupon/public_html/wp-content/plugins/test.php 在线7

如果我的add_action() 而调用的是:

add_action(\'init\', \'MyClass::init\');
然后我会理解这个错误(因为函数是静态调用的,没有DEMenu的实例$this 但我不明白为什么会发生这种情况,因为我使用了一个数组并传递了该类的一个实例。

我的具体问题实际上与这个问题有关。我创建了一个自定义Walker类,然后使用wp_nav_menu_args 筛选以通过我的自定义Walker。我在中获取此错误class-wp-walker.php 在线185. 该行尤其是:

$id_field = $this->db_fields[\'id\'];
有什么想法吗?

编辑-

test.php 现在运行正常,但原始问题尚未解决。。。因此,这里是我的插件索引。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!");
    }

}
如上所述,我得到以下错误:

Fatal error: 在中不在对象上下文中使用$this/home/coupon/public_html/wp-includes/class-wp-walker.php 在线185

自上述test.php 正在失败Walker_Nav_Menu 类通常不会出现此错误(直到我添加了插件),我想问题出在我的add_action()add_filter() 呼叫。然而,由于它仍然失败,我不能完全确定问题在哪里。。。

最终编辑-

仔细重读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();
<小时>Task: 调用类方法作为WordPress插件的挂钩,以便$this 变量未断开

3 个回复
最合适的回答,由SO网友:Andre 整理而成

Try:

<?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";
    }
}
?>
SO网友:Adrian Preuß

$class = new MyClass();
add_action(\'init\', array($class, \'init\'));
这是正确的!如果出现PHP错误,必须在“实例/对象”中使用return向类添加构造函数,如:

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

    /* The other Methods... */
}

SO网友:Dipesh KC

如果要处理静态类和方法

class Kc_Class{

  static function init(){

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

  }    
  static function my_static_method(){

    ...
  }
}
然后调用init方法

Kc_Class::init();

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $