Php WordPress钩子中的匿名函数

Php WordPress钩子中的匿名函数,php,wordpress,closures,hook,anonymous-function,Php,Wordpress,Closures,Hook,Anonymous Function,WordPress挂钩有两种使用方式: 使用回调函数名和适当的函数 add_action( 'action_name', 'callback_function_name' ); function callback_function_name() { // do something } 使用匿名函数(闭包) WordPress的使用方式有什么不同吗?首选的方式是什么?为什么?匿名函数的缺点是无法使用删除操作 重要提示:要删除挂钩,添加挂钩时,$function\u To\u remo

WordPress挂钩有两种使用方式:

  • 使用回调函数名和适当的函数

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


  • WordPress的使用方式有什么不同吗?首选的方式是什么?为什么?

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

    重要提示:要删除挂钩,添加挂钩时,
    $function\u To\u remove
    $priority
    参数必须匹配。这适用于过滤器和操作。移除失败时不会发出警告。

    因为您没有定义要删除的
    函数,所以无法删除它


    因此,您不应该在其他人可能希望覆盖的插件或主题中使用此函数。

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

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

    更确切地说,我想从;要实际演示这如何取决于用例,请执行以下操作:


    “为什么我们在这里使用命名函数[作为ajax操作挂钩的回调][…]?因为PHP最近才支持闭包。[…]因为有些人可能仍然在运行旧版本的PHP,我们总是使用命名函数来实现最大的兼容性。如果您有一个最新的PHP版本,并且只为自己的安装而开发,请继续使用闭包,如果您喜欢的话。”

    我不是WP方面的专家,但我见过的大多数钩子都不使用annon函数。但无论如何。这并不是说使用它们有什么不对。我想这可以归结为你到目前为止在这个项目上是如何做到的。坚持其中之一,保持一致。完全不同意在钩子中使用闭包。你永远不可能知道别人是如何处理钩子的。例如,其中一个可能有必要取下你的钩子,并用盖子将他/她卡住。只有在不操纵公共API接口的上下文中使用闭包时,闭包才是一件好事。您也可以以另一种方式使用命名空间函数:
    add_action('acf/init','child_theme\load_content_types')
    您可以在
    名称空间子主题下面使用它
    .WordofAdvice,当您使用匿名函数进行钩子回调时,实际上是在使代码不稳定。甚至无法检查
    has_action
    是否有此类回调,更不用说覆盖代码了。但是代码覆盖率是一个完全不同的野兽…我刚刚看到这篇文章,我真的只是想强调一下在对这个答案的评论中所说的。正如@TeeDeeJee的回答所述,如果你的插件/主题被其他人使用/修改,你应该避免这样做。但是假设你自己开发了一个主要的自定义插件,你只在自己的网站上使用它,插件的正常运行对你的网站至关重要。在这些情况下,通过匿名函数从钩子中移除(重要的)插件回调真的是个坏主意吗。。。。您甚至可以使用
    remove_all_actions()
    remove_all_filters()
    删除匿名钩子。但即便如此,我同意在WordPress中定义正则函数是首选模式。关于主题的有趣文章:
    class SomeClass
    {
        public function __construct()
        {
            add_action('wp_head', function () {
                $this->addSomeStyling();
            });
        }
    
        protected function addSomeStyling()
        {
            echo '<style> body { color: #999; } </style>';
        }
    }
    
        public function __construct()
        {
            $self = $this;
    
            add_action('wp_head', function () use ($self) {
                $self->addSomeStyling();
            });
        }