抽象类中的插件激活挂钩

时间:2014-05-20 作者:Yoav Kadosh

我想为我开发的每个WordPress插件创建一个通用的抽象类。作为类初始化过程的一部分,我想启动激活挂钩,它调用一个抽象方法,该方法将由子类定义。

例如:

abstract class AbstractPlugin extends WP_Plugin {
    public function init() {
        register_activation_hook( __FILE__, array( $this, \'on_activation\' ) );
        register_deactivation_hook( __FILE__, array( $this, \'on_deactivation\' ) );
    }

    public abstract function on_activation();
    public abstract function on_deactivation();
}
然而,中的第一个参数register_activation_hook 应该是定义子类的文件的路径,该路径未知,即使已知,也不起作用。

有没有办法绕过这个问题?

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

解决这个问题的最好方法是不要创建那个抽象类。

不要将对象创建与业务逻辑结合在同一个类中。这称为静态链接依赖,通常是有缺陷的设计,因为您无法在运行时更改它(例如,对于测试或每个挂钩)。Avoid inheritance.

Separation of concernsdependency injection 将解决这个问题。

实例

interface Plugin_Setup_Interface
{
    public function activate( $network_wide );
    public function deactivate( $network_wide );
}

class Plugin_Setup implements Plugin_Setup_Interface
{

    public function activate( $network_wide ) {}

    public function deactivate( $network_wide ) {}
}

class Plugin_Starter
{
    private $plugin_file = \'\';

    private $setup = NULL;

    public function __construct(
                               $plugin_file,
        Plugin_Setup_Interface $setup = NULL
    )
    {
        $this->plugin_file = $plugin_file;
        $this->setup       = $setup;
    }

    public function init()
    {
        if ( ! is_null( $this->setup ) )
        {
            register_activation_hook(
                $this->plugin_file,
                array ( $this->setup, \'activate\' )
            );

            register_deactivation_hook(
                $this->plugin_file,
                array ( $this->setup, \'deactivate\' )
            );
        }
    }
}

// call your auto-loader, then …

$start = new Plugin_Starter( __FILE__, new Plugin_Setup() );
$start->init();
现在,您可以为每个插件创建专门的去激活例程,并且仍然可以重用starter类。

结束

相关推荐

is_active-sidebar loop

因此,我有4个小部件,它们位于大3列中,当它们不活动时,我会放置一个占位符作为用户指南,以便用户知道在哪里放置什么。我确实成功地计算出了is\\u active,但它原来是一个很长的代码,我想知道是否有办法缩短它。从available-course-list-1到-4的小部件<?php if ( is_active_sidebar( \'available-course-list-1\' ) ) : ?> <div class=\"large-3 medium-3 col