将扩展类方法作为WordPress中的回调函数传递

时间:2012-10-10 13:39:11

标签: php class wordpress-plugin wordpress

这是this question的延续。当类扩展时,它引用原始类方法。创建的页面中的回显类名称应为 AnotherAdminPage ,这是扩展的类名。

/* 
    Plugin Name: static method callback demo
*/

class AnotherAdminPage extends AdminPageClass {
}

add_action('admin_menu', AnotherAdminPage::_admin_menu());

class AdminPageClass {

    static function _admin_menu() {
        $class_name = get_class();
        $classinstance = new $class_name();
        return array(&$classinstance, "admin_menu");
    }
    function admin_menu() {
        add_options_page(
            'Sample Admin Page Class', 
            'Sample Admin Page Class', 
            'manage_options',
            'sample_admin-page_class', 
            array(&$this, 'admin_page'));
    }
    function admin_page() {
        ?>
        <div class="wrap">
            <p><?php echo get_class(); ?></p>
        </div>
        <?php
    }
}

它通过重新定义扩展类中的方法来工作,但在这种情况下扩展它会变得毫无意义。

class AnotherAdminPage extends AdminPageClass {

    static function _admin_menu() {
        $class_name = get_class();
        $classinstance = new $class_name();
        return array(&$classinstance, "admin_menu");
    }   
    function admin_page() {
        ?>
        <div class="wrap">
            <p><?php echo get_class(); ?></p>
        </div>
        <?php
    }   
}

那么有更优雅的方式吗?

3 个答案:

答案 0 :(得分:1)

您应该使用get_called_class(PHP 5.3)

编辑

如果你没有PHP 5.3,你应该阅读这个

PHP get_called_class() alternative

答案 1 :(得分:1)

使用get get_called_class 而不是 get_class http://php.net/manual/en/function.get-called-class.php。然后您不需要重新定义_admin_menu函数

答案 2 :(得分:-1)

我自己发现它有效。

/* 
    Plugin Name: extended class method as a callback demo
*/

class AnotherAdminPage extends AdminPageClass {
}

add_action('admin_menu', array(new AnotherAdminPage, "admin_menu"));

class AdminPageClass {

    function admin_menu() {
        add_options_page(
            'Sample Admin Page Class', 
            'Sample Admin Page Class', 
            'manage_options',
            'sample_admin_page_class', 
            array(&$this, 'admin_page'));
    }
    function admin_page() {
        ?>
        <div class="wrap">
            <p><?php echo get_class($this); ?></p>
        </div>
        <?php
    }   
}