WordPress 钩子中的匿名函数
Anonymous functions in WordPress hooks
可以通过两种方式使用 WordPress 挂钩:
使用回调函数名称和适当的函数
add_action( 'action_name', 'callback_function_name' );
function callback_function_name() {
// do something
}
使用匿名函数(闭包)
add_action( 'action_name', function() {
// do something
} );
WordPress使用什么方式有什么区别吗?首选方式是什么?为什么?
匿名函数的缺点是您无法使用 remove_action 删除操作。
重要提示:要删除挂钩,添加挂钩时 $function_to_remove
和 $priority
参数必须匹配。这适用于过滤器和操作。删除失败不会给出警告。
因为你没有定义function_to_remove
,你不能删除它。
所以你永远不应该在其他人可能想要覆盖的插件或主题中使用它。
使用闭包的好处是保持全局命名空间干净,因为您不必先创建全局函数来作为回调传递。
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>';
}
}
通常需要将回调方法设置为public,但在这种情况下您也可以将它们设置为私有或受保护.
此解决方案仅适用于 PHP 5.4+。为了使其也适用于 PHP 5.3,您需要显式地将 $this
对象引用传递给闭包,例如:
public function __construct()
{
$self = $this;
add_action('wp_head', function () use ($self) {
$self->addSomeStyling();
});
}
更准确地说,我想从 current wordpress docs 中添加这个;实际演示这如何取决于用例:
“为什么我们在这里使用命名函数[作为 ajax 动作挂钩的回调] [...]?因为闭包最近才被 PHP 支持。[... ] 由于有些人可能仍然是 运行 旧版本的 PHP,我们始终使用命名函数来实现最大兼容性。如果您使用的是最新的 PHP 版本并且仅为您自己的安装而开发,如果你愿意,继续使用闭包。"
可以通过两种方式使用 WordPress 挂钩:
使用回调函数名称和适当的函数
add_action( 'action_name', 'callback_function_name' ); function callback_function_name() { // do something }
使用匿名函数(闭包)
add_action( 'action_name', function() { // do something } );
WordPress使用什么方式有什么区别吗?首选方式是什么?为什么?
匿名函数的缺点是您无法使用 remove_action 删除操作。
重要提示:要删除挂钩,添加挂钩时 $function_to_remove
和 $priority
参数必须匹配。这适用于过滤器和操作。删除失败不会给出警告。
因为你没有定义function_to_remove
,你不能删除它。
所以你永远不应该在其他人可能想要覆盖的插件或主题中使用它。
使用闭包的好处是保持全局命名空间干净,因为您不必先创建全局函数来作为回调传递。
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>';
}
}
通常需要将回调方法设置为public,但在这种情况下您也可以将它们设置为私有或受保护.
此解决方案仅适用于 PHP 5.4+。为了使其也适用于 PHP 5.3,您需要显式地将 $this
对象引用传递给闭包,例如:
public function __construct()
{
$self = $this;
add_action('wp_head', function () use ($self) {
$self->addSomeStyling();
});
}
更准确地说,我想从 current wordpress docs 中添加这个;实际演示这如何取决于用例:
“为什么我们在这里使用命名函数[作为 ajax 动作挂钩的回调] [...]?因为闭包最近才被 PHP 支持。[... ] 由于有些人可能仍然是 运行 旧版本的 PHP,我们始终使用命名函数来实现最大兼容性。如果您使用的是最新的 PHP 版本并且仅为您自己的安装而开发,如果你愿意,继续使用闭包。"