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



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

完整场景:

  • 主题:报纸
  • 文件: td_module.php (包括/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 上运行,如果你绝对相信这样做的话。

您的问题是基类是您没有编写的供应商代码。

因此,在您的类之间创建一个类来扩展它!

工作完成!

<?php
class SomeWordpressCrap
{
public function doSomething()
{
return 'something';
}
}
class YourAwesomeNewClass extends SomeWordpressCrap
{
public function doSomething()
{
return 'something better!';
}
}
class OneOfYourExistingClasses extends YourAwesomeNewClass
{
}

更新 所以事实证明OneOfYourExistingClasses也是供应商代码,因此上述解决方案将不起作用。

然而!您可以使用Roave的"Better Reflection"库,您可以在此处找到 https://github.com/Roave/BetterReflection

这将允许你"改变函数或方法的主体来做一些不同的事情",我相信这正是你所需要的。祝你好运!

相关内容

  • 没有找到相关文章

最新更新