【问题标题】:Passing Class Method as a Call-Back Function in WordPress在 WordPress 中将类方法作为回调函数传递
【发布时间】:2012-10-09 06:37:32
【问题描述】:

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

我通常使用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
    }
}

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

add_action('init', 'load_admin_page_class');
function load_admin_page_class() {
    $o = new AdminPageClass;
}

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

$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
    }
}

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

感谢您的信息。

【问题讨论】:

    标签: php class wordpress


    【解决方案1】:

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

    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
        }       
    }
    

    【讨论】:

    • 不错且有帮助的答案。谢谢你。这对我帮助很大。
    【解决方案2】:

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

    /* 
        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
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多