有没有办法同时从我的插件类和WP_LIST_Class继承方法?

时间:2011-02-25 作者:wyrfel

因此,WP 3.1引入了奇特的WP\\u List\\u类(),使我重写了所有自定义管理表。很公平。但是在good\'ol时代,我能够使用$this->method() 因为我将页面文件包含在通过add_submenu_page(). 那很好,有点优雅——或者至少很好——我想。

但现在,我的代码必须位于我的\\u WP\\u List\\u类的方法中,该类继承自WP\\u List\\u类。由于我不能进行多重继承,我似乎必须引用我的全局插件实例或在类中重新关联它,这两种情况中的任何一种都会让我感到不安。

类堆叠似乎也不是一个选项,因为很明显,我不能让WP\\u List\\u类继承我的插件类,也不想让我的插件类继承WP\\u List\\u类。

是我忽视了什么,还是我必须接受它?

编辑:更多上下文:

我可能想得太复杂了,但我的场景是这样的:我有一个“元”插件类,它被其他插件实例化(多次)。所以我甚至不知道它是什么,坦率地说,我不想知道这些实例中的每一个都将自己挂接到管理菜单中,并创建一个自定义菜单页。这些实例中的每一个都会获得一些传递的参数(比如一个id,比如一个实例),这些参数在实例化时存储在内部。如果调用一个方法,该方法依赖于这些内部存储的值。

到目前为止,这些实例中的每一个都可以独立存在,我不需要在任何数组或任何东西中注册它们,如果需要,您甚至可以匿名实例化它们。

现在,我需要将方法添加到我的WP\\u List\\u类继承类中,该类也将依赖于这些值。所以我唯一能想象的就是这样做:

function table_me_some() {
    $table = new My_WP_List_Class(&$this);
    ...
}
然后在My_WP_List_Class 执行以下操作:

function __construct($mama) {
    $this->_mama = $mama;
}

function whatever() {
    $this->_mama->my_plugin_class_instance_method();
}
那么my_plugin_class_instance_method() 存在于我的实例化插件类中,并引用它自己的内部变量存储。

然而,我现在才想到这个,但我仍然觉得它不是很整洁。

2 个回复
SO网友:Jan Fabry

这是一种常见的设计模式,我会用与您相同的方法来解决它。允许My_WP_List_Class 延伸WP_List_Class, 并将“配置”对象传递给它。通过定义配置对象必须遵循的接口,您甚至可以使关系更加明确:

interface My_WP_List_Configuration
{
    public function get_name();
    public function get_admin_page_uri();
    // ...
}

class WPSE10402_Plugin extends Wyrfel_Plugin implements My_WP_List_Configuration
{
    public function get_name()
    {
        return $this->_name;
    }

    public function get_admin_page_uri()
    {
         // ...
    }
}
我看不出与当前使用动作将功能挂钩的方式有多大区别。是的,您的代码现在是在类中构造的,而不是在函数列表中,但这是唯一的区别,不是吗?

SO网友:Peter Rowell

Take 2:

我的第一个答案是。。。不对。

基本上,PHP不支持多重继承。然而,有些东西可能会让你“离得足够近”我发现了一些使用mixin类的symfony引用,这是我在其他语言中成功使用的。

抓住1.4.9版本(当前稳定)并执行grep -i mixin -r .

我找到了很多关于它的参考资料。E、 g。lib/plugins/sfPropelPlugin/lib/addon/sfMixer.class.php. 这方面的文档有点少,但这可能是您需要的。

结束

相关推荐

JQuery和is_admin()的问题

我已经创建了一个插件在这个插件中,我有一个显示一些数据的函数在此函数中,我使用is_admin() 确定是否从后端调用该函数,因为这样我可以添加一些附加信息。在管理页面中,函数正常加载。使用jQuery进行更新后,调用该函数以显示新数据。问题是,当通过jQuery调用函数时is_admin() 是false, 即使我是后台管理模式。为什么不是is_admin 通过jQuery调用什么工作?Update 的代码is_admin() 在单击新事件(或更新现有事件)的保存按钮时调用。单击保存/更新后,通过jQ