如何在PHP中使用插件类正确执行do_action / add_action?

时间:2015-02-04 10:40:46

标签: php wordpress class

我认为问题在于有太多人试图回答问题,例如https://wordpress.stackexchange.com/questions/48085/add-action-reference-a-class

在我的情况下,我在主题模板中使用了do_action

哪个最好......

class mytheme_do_header_content{ 

    public function __construct() {

         add_action( 'mytheme_do_header', array( $this, 'mytheme_do_header_content_make' ) );

    }

    function mytheme_do_header_content_make(){

    //some code goes here
    }

    public function __destruct() {

    }
}
new mytheme_do_header_content();

或者

class mytheme_do_header_content{ 

    public function __construct() {

        //some code goes here
    }

    public function __destruct() {

    }
}
add_action( 'mytheme_do_header', array( $this, 'mytheme_do_header_content_make' ) );

还是其他不喜欢上课的东西?

由于

2 个答案:

答案 0 :(得分:0)

第一个例子是最好的。你得到了相同的结果,但在第一个例子中,所有的钩子都包含在你的类中(封装)。

没有任何理由在课堂外添加这些钩子。

http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29

答案 1 :(得分:0)

这取决于你认为最好的东西。如果你以类的形式编写Wordpress插件,那么类的一个(静态)方法最好知道它如何实例化它自己。该方法还可以涵盖插件的注册:

add_action('plugins_loaded', array('mytheme_do_header_content', 'init'), 5);

class mytheme_do_header_content
{
    static function init() {
        $plugin = new self();
        add_action('mytheme_do_header', array($plugin, 'mytheme_do_header_content_make'));         
    } 

    function mytheme_do_header_content_make() {
        //some code goes here
    }
}

此变体具有好处

  • a)非静态代码不需要关心实例化和注册。这取决于你的插件有多详细,直到这对你的代码设计产生了影响,但是将对象实例化与用法分开并没有错。
  • 和b)只有在加载插件时才会实例化它。这是因为在::init挂钩上调用了插件plugins_loaded方法。这得益于静态插件工厂方法。