WordPress钩子中的匿名函数

Ale*_*hov 26 php wordpress hook closures anonymous-function

WordPress钩子有两种使用方式:

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

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

    add_action( 'action_name', function() {
        // do something
    } );
    
    Run Code Online (Sandbox Code Playgroud)

WordPress的使用方法有什么区别吗?什么是首选方式和原因?

Tee*_*Jee 32

匿名函数的缺点是您无法使用remove_action删除操作.

要点:要删除钩子,在添加钩子时,$function_to_remove$priority参数必须匹配.这适用于过滤器和操作.删除失败不会发出警告.

因为您没有定义function_to_remove,所以无法将其删除.

因此,您永远不应该使用其他人可能想要覆盖的插件或主题.

  • 你甚至可以使用 `remove_all_actions()` 和 `remove_all_filters()` 删除匿名钩子。但即便如此,我同意定义常规函数是 WordPress 中的首选模式。 (2认同)

Vic*_*tor 16

使用闭包具有保持全局命名空间清洁的好处,因为您不必首先创建全局函数作为回调传递.

add_action('admin_init', function () {
    // some code...
});
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢使用闭包作为回调,除非:

  • 您希望删除回调的可能性
  • 回调函数需要多次使用
  • 您需要支持较旧的PHP版本(少于5.3)

类中的闭包

闭包在课堂上也是有益的.

class SomeClass
{
    public function __construct()
    {
        add_action('wp_head', function () {
            $this->addSomeStyling();
        });
    }

    protected function addSomeStyling()
    {
        echo '<style> body { color: #999; } </style>';
    }
}
Run Code Online (Sandbox Code Playgroud)

通常,回调方法需要公开,但在这种情况下,您也可以将它们设为私有受保护.

此解决方案仅适用于PHP 5.4+.为了使它适用于PHP 5.3,您需要显式地将$this对象引用传递给闭包,例如:

    public function __construct()
    {
        $self = $this;

        add_action('wp_head', function () use ($self) {
            $self->addSomeStyling();
        });
    }
Run Code Online (Sandbox Code Playgroud)