-1

这是这个问题的延续。当类被扩展时,它引用了原来的类方法。在创建的页面中回显的类名应该是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
    }   
}

那么有没有更优雅的方式来做到这一点?

4

3 回答 3

1

你应该使用get_called_class(PHP 5.3)

编辑

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

PHP get_call_class() 替代

于 2012-10-10T13:48:08.497 回答
1

使用 get get_call_class而不是get_classhttp://php.net/manual/en/function.get-call-class.php。那么就不需要重新定义_admin_menu函数了

于 2012-10-10T13:48:28.213 回答
-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
    }   
}
于 2012-10-10T15:00:11.587 回答