WordPress 钩子中的匿名函数

Anonymous functions in WordPress hooks

可以通过两种方式使用 WordPress 挂钩:

  1. 使用回调函数名称和适当的函数

    add_action( 'action_name', 'callback_function_name' );
    function callback_function_name() {
        // do something
    }
    
  2. 使用匿名函数(闭包)

    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 版本并且仅为您自己的安装而开发,如果你愿意,继续使用闭包。"