PHP中的闭包/装饰器?

Closure / Decorator in PHP?

提问人:tim 提问时间:12/20/2021 更新时间:12/20/2021 访问量:57

问:

我想将一个函数绑定到另一个函数以缓存其结果。 不幸的是,它不是一个类,因此我认为我不能使用 Closures。

即像 Python 中的装饰器一样。

我想这样做,因为我无法通过修补 API 代码来修改函数。

所以我有一个经常被调用的函数,它总是执行一个 SQL 查询:

function api_func() {
    global $wpdb;
    // ... do a query without caching ...
    return $wpdb->get_col(...);
}

我想用另一个函数 cache_func() 包围这个函数,这样,每当调用 api_func() 时,都会调用 cache_func() 并可以缓存一次结果。

有什么想法吗?

谢谢

PHP WordPress 闭包装饰

评论

0赞 Patrick Janser 12/20/2021
是由您编写的还是来自 API?或者你有办法覆盖这个功能吗?如果是,那么我会在其中添加一个静态变量来存储下一次调用的结果。Drupal CMS有一个非常简洁的解决方案,可以创建带有缓存的功能,您也可以从外部清除这些函数。查看 Drupal 的示例和文档api_func()
0赞 tim 12/20/2021
没错,这就是我想做的:添加一个静态变量。不幸的是,api_func() 位于一个大型 Wordpress 插件的核心中,我想保持未修补状态,以便安全地进行更新。这就是为什么我想要一个“闭包”函数,每当 api_func() 被调用时,它就会运行,以通过周围函数中的静态缓存来包围自己api_func
0赞 Patrick Janser 12/20/2021
插件的作者是否使用或类似的东西,以便有人可以稍微更改插件?如果插件缺少一些优化,您可以对其进行修补并建议将补丁包含在下一个版本中。add_filter()
0赞 tim 12/20/2021
不幸的是,没有 - 只是数据库调用并返回值。也许我可以直接将低级挂钩到 wpdb->query 中,但这相当丑陋。是的,更改请求会很好,只是还没有与该开发人员合作的良好经验,因此不确定他们是否会包含它。

答: 暂无答案