問題描述

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