Php WordPress钩子中的匿名函数
WordPress挂钩有两种使用方式:Php WordPress钩子中的匿名函数,php,wordpress,closures,hook,anonymous-function,Php,Wordpress,Closures,Hook,Anonymous Function,WordPress挂钩有两种使用方式: 使用回调函数名和适当的函数 add_action( 'action_name', 'callback_function_name' ); function callback_function_name() { // do something } 使用匿名函数(闭包) WordPress的使用方式有什么不同吗?首选的方式是什么?为什么?匿名函数的缺点是无法使用删除操作 重要提示:要删除挂钩,添加挂钩时,$function\u To\u remo
add_action( 'action_name', 'callback_function_name' );
function callback_function_name() {
// do something
}
WordPress的使用方式有什么不同吗?首选的方式是什么?为什么?匿名函数的缺点是无法使用删除操作 重要提示:要删除挂钩,添加挂钩时,
$function\u To\u remove
和$priority
参数必须匹配。这适用于过滤器和操作。移除失败时不会发出警告。
因为您没有定义要删除的函数,所以无法删除它
因此,您不应该在其他人可能希望覆盖的插件或主题中使用此函数。使用闭包的好处是保持全局命名空间干净,因为您不必首先创建全局函数作为回调传递
add_action('admin_init', function () {
// some code...
});
我个人更喜欢使用闭包作为回调,除非:
- 您需要删除回调的可能性
- 回调函数需要多次使用
- 您需要支持较旧的PHP版本(低于5.3)
类中的闭包
闭包在类中也是有益的
class SomeClass
{
public function __construct()
{
add_action('wp_head', function () {
$this->addSomeStyling();
});
}
protected function addSomeStyling()
{
echo '<style> body { color: #999; } </style>';
}
}
更确切地说,我想从;要实际演示这如何取决于用例,请执行以下操作:
“为什么我们在这里使用命名函数[作为ajax操作挂钩的回调][…]?因为PHP最近才支持闭包。[…]因为有些人可能仍然在运行旧版本的PHP,我们总是使用命名函数来实现最大的兼容性。如果您有一个最新的PHP版本,并且只为自己的安装而开发,请继续使用闭包,如果您喜欢的话。”我不是WP方面的专家,但我见过的大多数钩子都不使用annon函数。但无论如何。这并不是说使用它们有什么不对。我想这可以归结为你到目前为止在这个项目上是如何做到的。坚持其中之一,保持一致。完全不同意在钩子中使用闭包。你永远不可能知道别人是如何处理钩子的。例如,其中一个可能有必要取下你的钩子,并用盖子将他/她卡住。只有在不操纵公共API接口的上下文中使用闭包时,闭包才是一件好事。您也可以以另一种方式使用命名空间函数:add_action('acf/init','child_theme\load_content_types')
您可以在名称空间子主题下面使用它
.WordofAdvice,当您使用匿名函数进行钩子回调时,实际上是在使代码不稳定。甚至无法检查has_action
是否有此类回调,更不用说覆盖代码了。但是代码覆盖率是一个完全不同的野兽…我刚刚看到这篇文章,我真的只是想强调一下在对这个答案的评论中所说的。正如@TeeDeeJee的回答所述,如果你的插件/主题被其他人使用/修改,你应该避免这样做。但是假设你自己开发了一个主要的自定义插件,你只在自己的网站上使用它,插件的正常运行对你的网站至关重要。在这些情况下,通过匿名函数从钩子中移除(重要的)插件回调真的是个坏主意吗。。。。您甚至可以使用remove_all_actions()
和remove_all_filters()
删除匿名钩子。但即便如此,我同意在WordPress中定义正则函数是首选模式。关于主题的有趣文章:
class SomeClass
{
public function __construct()
{
add_action('wp_head', function () {
$this->addSomeStyling();
});
}
protected function addSomeStyling()
{
echo '<style> body { color: #999; } </style>';
}
}
public function __construct()
{
$self = $this;
add_action('wp_head', function () use ($self) {
$self->addSomeStyling();
});
}