当我们只需使用add_filter时,使用add_action有什么价值?


10

我刚刚研究了wordpress代码,发现了add_action的定义:

function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
    return add_filter($tag, $function_to_add, $priority, $accepted_args);
}

现在,为什么我们浪费一个CPU周期仅调用另一个我们可以简单完成的函数,然后又不必为同一件事记住两个不同的函数名。


这是为什么add_action和add_filter返回值不同的原因吗?wordpress.stackexchange.com/questions/283564/…–
mahatmanich

Answers:


9

行动做事。过滤器修改事物。您会在操作中进行操作,而如果您应用过滤器,则除了修改要过滤的值之外,您不会期望发生任何事件或操作。例如,发送电子邮件或将DB值保存在过滤器中是不可行的,但是在操作中是可以的。在某些情况下,您需要违反此约定,但这是有用且必要的。

通过将all add_actiondo_actioncall 替换为对应的筛选器,您可以消除区别,并强制将其他名称(例如'the_content'etc)作为动作或筛选器的知识带出世界,并带入您的记忆中,从而鼓励犯错。

因此,与其让您的代码更难阅读,不如意识到,如果您的代码很慢,那不是因为您没有在这里和那里刮掉一两个指令,而是因为您的服务器速度慢,或者您的代码的算法结构和处理数据的性质。从重构流程,升级硬件或更改范例中,您将获得更多收益。在总体方案中,慢速站点很可能很慢,因为它执行很多操作或编写的查询不正确,例如依赖元数据的后置查询或__not_in类型查询

从角度来看,当WordPress运行时,PHP执行数百万条指令。交换过滤器动作几乎不会使百分之一的前十位陷入低谷。

http://fabien.potencier.org/article/8/print-vs-echo-which-one-is-faster

我已经尝试过全新的Wordpress安装。该脚本在我的笔记本电脑上以“总线错误”结束之前停止运行,但操作码数量已超过230万。说够了。

如果您真的想尝试,请查看该人如何使用VLD并自己检验您的理论。


因此,这意味着实际上没有任何区别,只不过类似于一个叫两个不同名字的人....只是我们在家里称呼他为一个人而在办公室称呼他为:)
加根2012年

动作函数对过滤器的包装可能会导致4或5个操作码的损失,这在事物规模上是微不足道的,在大型数组上使用三元运算符(?在我链接到的博客上,很值得浏览他的博客)。TLDR有区别,但是它是如此之小以至于毫无意义
Tom J Nowell

感谢buddy清除了这个问题,我从未考虑过许多​​人在同一代码上工作的事实,如果有人只是继续为过滤器而不是操作编写do_action(),这将成为一个更大的问题。因此,在确定自己是使用该代码的唯一人员之前,我将使用add_filters,否则我将写add_action():)
Gagan 2012年

还将在周末测试您在帖子中提到的方法,并将发布结果。
加根2012年

1
我建议您遵守约定,始终使用apply_filters将是微优化。您会获得性能损失,但不是从PHP操作码中获得,这是精神上的性能损失,更糟。如果您进行自定义操作/过滤器并稍后再访问,这也是一种误导,它是操作还是过滤器?您无
所知
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.