问题描述

在学习元数据 lazy-loading 的同时,我遇到了 these lines of code

// Don't use `wp_list_pluck()` to avoid by-reference manipulation.
$comment_ids = array();
if ( is_array( $comments ) ) {
    foreach ( $comments as $comment ) {
        if ( $comment instanceof WP_Comment ) {
            $comment_ids[] = $comment->comment_ID;
        }
    }
} 

我以为它与 this topic 有关,但在这里没有引用,唯一的 foreach 循环被包含在一个函数中,在这种情况下 by-reference 的操作是怎样的?

而且,为了最佳实践,我们什么时候应该使用 wp_list_pluck()功能?

最佳解决方案

在任何 foreach 循环中,循环的数组的最后一个值保留在 foreach 循环结束后。这就是为什么在 foreach 循环完成后,实际上应该总是取消设置该值。

如果 $index_key 未通过,wp_list_pluck()也只是基本的 foreach 循环。此外,与任何 foreach 循环一样,阵列的最后一个值仍然在 foreach 循环结束之后,我认为这是该代码中引用的代码。

但是,这个假设是错误的。 Functions 是自包含的代码段,除了全局变量之外,函数中的这些代码段只能用于函数本身。 wp_list_pluck()没有全局化任何内部值 (变量),所以即使在函数中 foreach 循环之后数组的最后一个值仍然可用,并且不会被取消设置,它不可用于任何代码之外的任何代码功能,所以您不能按照该规范中的该行所述 pass-by-reference 问题。

wp_list_pluck()与任何简单的 foreach 循环一样有效。选择取决于你。我个人更喜欢 wp_list_pluck(),因为它节省了代码,并且您不需要记住去设置以后可能导致调试噩梦的变量。

只是最后一个注意事项,wp_list_pluck()也可以替代 array_column,因为它的工作原理相同,如果 $index_key 被传递给函数

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。