WordPress钩子中的匿名函数

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

  1. 使用回调函数名和相应的函数

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

    add_action( 'action_name', function() {
        // do something
    } );
    

WordPress使用什么方式有什么区别吗?什么是首选方式,为什么?


答案 1

匿名函数的缺点是无法删除具有remove_action的操作。

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

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

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


答案 2

使用闭包的好处是保持全局命名空间的干净,因为您不必先创建全局函数作为回调传递。

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>';
    }
}

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

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

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

        add_action('wp_head', function () use ($self) {
            $self->addSomeStyling();
        });
    }

推荐