在WordPress中将类方法作为回调函数传递

Ten*_*eno 3 php wordpress class wordpress-plugin

我正在寻找一种方法将类方法传递给回调函数参数.

我通常使用create_function()如下,但我听说它很慢并且很难调试.

add_action('init', create_function('', '$o = new AdminPageClass;'));
class AdminPageClass {

    function __construct() {
        add_action('admin_menu', array(&$this, '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">
            <h1>Hi there</h1>
            <p>Hello World!</p>
        </div>
        <?php
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,它可以通过这样的额外功能来完成; 但是,如果可能的话,我想在没有它的情况下这样做.

add_action('init', 'load_admin_page_class');
function load_admin_page_class() {
    $o = new AdminPageClass;
}
Run Code Online (Sandbox Code Playgroud)

此外,在它之前实例化类对象使其成为可能,但它也创建了一个额外的行.

$o = new AdminPageClass;
add_action('admin_menu', array(&$o, '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">
            <h1>Hi there</h1>
            <p>Hello World!</p>
        </div>
        <?php
    }
}
Run Code Online (Sandbox Code Playgroud)

我总是在单独的文件中定义类,所以我更喜欢第一种减少主插件文件中的行的方法.但如上所述,create_function()应避免使用.

我感谢您的信息.

Ten*_*eno 10

我发现根本不需要创建静态方法.

add_action('admin_menu', array(new AdminPageClass, "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">
            <h1>Hi there</h1>
            <p>Hello World!</p>
        </div>
    <?php
    }       
}
Run Code Online (Sandbox Code Playgroud)


小智 6

创建一个静态方法,该方法返回包含类实例和方法名称的数组.

/* 
    Plugin Name: static method callback demo
*/

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

class AdminPageClass {

    static function _admin_menu() {
        $class_name = get_class();
        $classinstance = new $class_name();
        return array(&$classinstance, "admin_menu");
    }
    function admin_menu($instantiate=false) {
        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">
            <h1>Hi there</h1>
            <p>Hello World!</p>
        </div>
        <?php
    }
}
Run Code Online (Sandbox Code Playgroud)