問題描述

在學習元數據 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。