插件:连接有自己挂钩的类

时间:2016-01-14 作者:DarkNeuron

我想知道是否有一种“最佳”的方法来连接具有自己挂钩的类,仍然要确保在类有机会声明自己的挂钩之前,这些挂钩还没有运行。

我迷失在OOP插件上下文中的钩子层次结构中,我不希望所有钩子都在一个“上帝”构造函数中(如这里所述:Best way to initiate a class in a WP plugin?)

我目前正在努力使插件相互依赖(关注点分离),在这方面我遇到了各种问题;类等问题不存在,因为它们尚未初始化。

我相信,基于WP的结构,没有一个简单的答案。也许答案只是从头开始重新思考和重新设计插件。

感谢有经验的WP-OOP插件开发人员。

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

构造函数不应该做任何工作,它们是用来实例化类的。您可以尝试构建只关心做一件事的类(SOC)。我认为您的问题更多的是如何将这些类作为一个组合的工作系统来使用,因为如果操作正确,您不应该遇到您所面临的问题。

对我来说,WordPress类真是一团糟

做很多工作(每个人都在谈论的“上帝”课程)

使用公共属性(始终使用受保护或私有属性,除用于扩展父类的另一个类外,该类之外不应提供属性)

关键是,你不应该将WordPress类视为灵感。

为了快速脱离主题,对于SOC,请查看干涉注入(尤其是塞特注入)@gmazzap在他的回答中巧妙地使用了干涉酶注射here. 网上也有大量关于干扰素注射的信息。您也可以退房my question over at codereview 关于这个问题。

回到您的问题,这是一个如何在类中使用挂钩的示例(,示例中添加了setter和getter用于setter注入)。正如我所说的,构造函数不应该做任何工作,所以将您的操作和过滤器移到构造函数之外

class PropertyValue
{
    // Add my protected and/or private properties here
    protected $propery;

    // Constructor
    public function __construct( $property = NULL )
    {
        $this->property = $property;
    }

    // For setter interfase injection, define your setters and getters
    // Setter method
    public function setProperty( $property )
    {
        $this->property = $property;
        return $this;
    }

    // Getter method
    public function getProperty()
    {
        return $this->property;
    }

    // This will be the method used to run our hooks
    public function init()
    {
        add_action( \'wp_head\', [$this, \'hookedMethod\'], PHP_INT_MAX );
    }

    // This is the method we will hook to wp_head or any other hook for that matter
    public function hookedMethod()
    {
        // Use $this->property to do something with.
        $value = \'This property value is \' . $this->property;
        ?><pre><?php var_dump( $value ); ?></pre><?php
    }
}
您现在将按如下方式使用该类

$newclass = new PropertyValue;
// Set the value of the property through the setter injection
$newclass->setProperty( \'$100 000\' );
// Call the init() method of our class in order to execute our hook
$newclass->init();
您现在应该看到,此属性值为100000美元,正在转储到标题中

这是非常基本的,应该至少能回答您的问题。正如我所说,看看关于如何使用setter接口注入的链接帖子,也可以利用google获取大量关于这方面的示例和教程。不幸的是,所有内容如何组合在一起在这里都是无关紧要的,因为这将是通用PHP,所以如果您在接口方面有任何问题,您应该寻求stackoverflow的支持,它已准备好处理这些特定问题;-)

相关推荐

当回调作为数组的一部分传递时,不会在addsetingsfield()中调用,但会识别出它就在那里。它使用OOP将类传递到类

我正在构建一个插件,我创建了一个新的管理页面和子页面,在这个子页面中,我想添加一些设置。这就是我使用设置API构建它们的原因我正在使用Composer和面向对象编程。我有一个名为SettingsAPI的文件夹,名称空间如下namespace Blocks\\Pages\\SettingsAPI;在该文件夹中,我有三个文件:AddSettings.php, Settings.php 和SettingsLayout.php. 它们三个都正确连接。这些文件具有区分大小写的类名称。Settings.php 有一个