WordPress钩子中的匿名函数

时间:2015-07-06 07:52:31

标签: php wordpress closures hook anonymous-function

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

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

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

    add_action( 'action_name', function() {
        // do something
    } );
    
  3. WordPress有什么不同之处?什么是首选方式和原因?

3 个答案:

答案 0 :(得分:30)

匿名功能的缺点是您无法使用remove_action删除操作。

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

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

所以你不应该在其他人可能想要覆盖的插件或主题中使用它。

答案 1 :(得分:15)

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

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();
        });
    }

答案 2 :(得分:0)

更准确地说,我想从 current wordpress docs;实际演示这如何取决于用例:

“为什么我们在这里使用命名函数[作为ajax动作钩子的回调][...]?因为PHP最近才支持闭包。[...]因为有些人可能仍在运行旧版本在 PHP 中,我们总是使用命名函数以获得最大的兼容性。如果你有一个最新的 PHP 版本并且只是为了你自己的安装而开发,如果你愿意,可以继续使用闭包。”