我正在研究WordPress项目。实现了一个子主题,父主题有一个类来显示作者的链接。我们已经实现了一项功能,以支持每个帖子多位作者,然后我们有自己的方法来显示适当的链接(不是单作者链接,而是根据作者数量来链接许多链接)。
完整方案:
td_module
抽象,父主题中的许多其他类都继承了这一类)get_author()
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] 删除。
我来说两句