在构造函数过滤器中扩展/覆盖父级的方法

妮米丝

我正在研究WordPress项目。实现了一个子主题,父主题有一个类来显示作者的链接。我们已经实现了一项功能,以支持每个帖子多位作者,然后我们有自己的方法来显示适当的链接(不是单作者链接,而是根据作者数量来链接许多链接)。

完整方案:

  • 主题:报纸
  • 档案:td_module.php(includes / wp_booster / td_module.php)
  • 类:(td_module抽象,父主题中的许多其他类都继承了这一类)
  • 方法: get_author()
  • 还有许多其他类在父主题中继承了td_module,因此我不能仅td_module在子主题中进行扩展,因为当更新主题时,对父主题的所有更改都会丢失

我需要以某种方式扩展此方法以显示不同的内容,但我不想更改td_module该类中的方法:即使它是最快/最安全的解决方案,每次升级主题时,该代码也会被覆盖

此方法在主题中广泛使用,这就是为什么在此处添加一些代码如此重要的原因。

为什么我仍然抱有希望:有一个WP过滤器td_wp_booster_module_constructor,在td_module类的构造函数上被调用。问题在于,此类在用于显示作者的方法上没有任何其他过滤器,而仅td_wp_booster_module_constructor在构造函数上具有过滤器调用。基本的PHP(和OOP)问题:是否可以通过在构造函数中使用此过滤器来扩展/替换方法?

一些代码来阐明:

abstract class td_module {
    ...
    function __construct($post, $module_atts = array()) {
        ...
        // Can I change the get_author behavior by using this filter?
        apply_filters("td_wp_booster_module_constructor", $this, $post);
        // This is the only filter available in the entire class!
        ...    
    }
    ...

    function get_author() {
        $buffy = '';
        // Code for generating author link ($buffy .= ...)
        ...
        // This function doesn't have any apply_filter, there are no filters available
        return $buffy;
    }
}
伊维

基本上,您不能在运行时修改类定义构造函数上有可用的过滤器的事实是红色的鲱鱼,并且实际上是不相关的。

可以get_author()通过外部类定义(用Wordpress的话语,过滤器和操作钩子)更改其行为,或者根本无法做到这一点

在Wordpress之外,在具有适当的依赖关系反转容器的应用程序中,您应该通过装饰类并让所有类的使用者使用装饰后的类来实现此目的。

但是,由于您无法告诉类使用方使用一个或另一个,并且您无法控制的许多代码可能直接实例化了该类,因此这样的事情根本无法实现。


有一个扩展程序Runkit,它允许在运行时更改行为和定义。甚至还有一种方法可以修改方法定义尽管我没有尝试过该扩展,并且不知道它是否在更新的PHP运行时中运行。

请注意,在生产代码上执行此操作几乎肯定是一个非常糟糕的主意,并且由于您无论如何都无法控制代码,因此您甚至无法确保会在首次使用定义之前就对其进行更改。

我还找到了Runkit的一个仓库,说如果您完全相信这样做的话,它几乎可以在PHP 7上运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Matlab中的函数过滤器

来自分类Dev

如何创建函数过滤器reactjs?

来自分类Dev

django过滤器将父级变为子级

来自分类Dev

从woocommerce中的类覆盖过滤器

来自分类Dev

Lodash过滤器数组并获取父级索引

来自分类Dev

IE无数过滤器

来自分类Dev

多数过滤器python

来自分类Dev

使用自定义函数过滤器跳过函数调用和返回值

来自分类Dev

需要通过构造函数或其他方式从Razor过滤器方法访问HttpContext

来自分类Dev

通过构造函数将方法参数发送到动作过滤器

来自分类Dev

执行从 Javascript 中的构造函数数组访问的构造函数的父级的“静态”方法

来自分类Dev

使用构造函数中的服务为全局过滤器配置DI容器

来自分类Dev

过滤器函数中的类型错误

来自分类Dev

在构造函数中扩展pixi.js精灵来访问父级的属性

来自分类Dev

使用Ninject进行过滤器构造函数注入

来自分类Dev

Twig变量中的Twig扩展过滤器或函数名称不起作用?

来自分类Dev

Li3:父类中的查找过滤器在子级调用find()时不会触发

来自分类Dev

如果未覆盖构造函数属性,为什么对象的构造函数属性指向扩展函数中的父函数的构造函数而不是F

来自分类Dev

扩展文字过滤器

来自分类Dev

扩展Scala过滤器

来自分类Dev

Javascript filter()函数过滤父元素

来自分类Dev

如何覆盖过滤器:CSS中没有

来自分类Dev

如何覆盖过滤器:CSS中没有

来自分类Dev

如果用户在参数过滤器中输入星号,Tableau将显示所有ID

来自分类Dev

使用 2 参数过滤器(Angular)从对象中删除多个对象

来自分类Dev

如何在 ng-repeat 的多参数过滤器中实现循环?

来自分类Dev

在 React 中过滤结果的过滤器函数的可变版本?

来自分类Dev

布隆过滤器中的过滤器索引和哈希函数

来自分类Dev

过滤器不是函数

Related 相关文章

  1. 1

    Matlab中的函数过滤器

  2. 2

    如何创建函数过滤器reactjs?

  3. 3

    django过滤器将父级变为子级

  4. 4

    从woocommerce中的类覆盖过滤器

  5. 5

    Lodash过滤器数组并获取父级索引

  6. 6

    IE无数过滤器

  7. 7

    多数过滤器python

  8. 8

    使用自定义函数过滤器跳过函数调用和返回值

  9. 9

    需要通过构造函数或其他方式从Razor过滤器方法访问HttpContext

  10. 10

    通过构造函数将方法参数发送到动作过滤器

  11. 11

    执行从 Javascript 中的构造函数数组访问的构造函数的父级的“静态”方法

  12. 12

    使用构造函数中的服务为全局过滤器配置DI容器

  13. 13

    过滤器函数中的类型错误

  14. 14

    在构造函数中扩展pixi.js精灵来访问父级的属性

  15. 15

    使用Ninject进行过滤器构造函数注入

  16. 16

    Twig变量中的Twig扩展过滤器或函数名称不起作用?

  17. 17

    Li3:父类中的查找过滤器在子级调用find()时不会触发

  18. 18

    如果未覆盖构造函数属性,为什么对象的构造函数属性指向扩展函数中的父函数的构造函数而不是F

  19. 19

    扩展文字过滤器

  20. 20

    扩展Scala过滤器

  21. 21

    Javascript filter()函数过滤父元素

  22. 22

    如何覆盖过滤器:CSS中没有

  23. 23

    如何覆盖过滤器:CSS中没有

  24. 24

    如果用户在参数过滤器中输入星号,Tableau将显示所有ID

  25. 25

    使用 2 参数过滤器(Angular)从对象中删除多个对象

  26. 26

    如何在 ng-repeat 的多参数过滤器中实现循环?

  27. 27

    在 React 中过滤结果的过滤器函数的可变版本?

  28. 28

    布隆过滤器中的过滤器索引和哈希函数

  29. 29

    过滤器不是函数

热门标签

归档