-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_called_class() の代替

于 2012-10-10T13:48:08.497 に答える
1

get_classの代わりにget get_called_classを使用してください。http://php.net/manual/en/function.get-called-class.php。その後、_admin_menu 関数を再定義する必要はありません

于 2012-10-10T13:48:28.213 に答える