Kiedy należy, a kiedy nie, należy użyć wp_list_pluck ()?

10

Ucząc się o leniwym ładowaniu metadanych, poznałem następujące wiersze kodu :

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

Myślałem, że odnosi się to do tego tematu, ale nie ma tu żadnych odniesień, a jedyna foreachpętla jest owinięta wewnątrz funkcji. Jak w takim przypadku może dojść do manipulacji przez odniesienie?

A dla najlepszej praktyki, kiedy powinniśmy korzystać z wp_list_pluck()funkcji?

SarahCoding
źródło
Jestem z tobą, fwiw. Sprawdziłem źródło funkcji, kodeks i dokumenty deweloperów i nie widzę, do czego odnosi się ten komentarz.
Andy Macaulay-Brook

Odpowiedzi:

3

W dowolnej foreachpętli ostatnia wartość zapętlonej tablicy pozostaje po jej zakończeniu foreach. Właśnie dlatego zawsze należy zresetować tę wartość po zakończeniu foreachpętli.

wp_list_pluck()jest również podstawową foreachpętlą, jeśli $index_keynie zostanie przekazana. Podobnie jak w przypadku każdej foreachpętli ostatnia wartość tablicy pozostaje po jej zakończeniu foreachi myślę, że do tego właśnie odnosi się ta linia w kodeksie.

To założenie jest jednak błędne. Funkcje są samodzielnymi fragmentami kodu i oprócz globali te fragmenty kodu wewnątrz funkcji są dostępne tylko dla samej funkcji. wp_list_pluck()nie globalizuje żadnej ze swoich wartości wewnętrznych ( zmiennych ), więc nawet jeśli ostatnia wartość tablicy jest nadal dostępna po foreachpętli wewnątrz funkcji i nie zostanie rozbrojona, nie jest dostępna dla żadnego kodu poza funkcją, więc nie możesz mieć problemu z przejściem przez odniesienie, jak opisano w tym wierszu w kodeksie.

wp_list_pluck()jest równie poprawny w użyciu, jak każda prosta foreachpętla. Wybór należy do ciebie. Ja osobiście wolę, wp_list_pluck()ponieważ oszczędza to kod i nie musisz pamiętać o rozbrajaniu zmiennych, które później mogą prowadzić do debugowania koszmaru.

Tylko ostatnia uwaga, wp_list_pluck()może również zastąpić, array_columnponieważ działa tak samo, jeśli $index_keyzostanie przekazana do funkcji

Pieter Goosen
źródło
Zresetować czy zresetować?
fuxia
@toscho AFAIK i z tego, czego się nauczyłem, unset( $value )po foreachpętli, wp_reset_postdata()jeśli używałeś setup_postdata( $post )w foreachpętli, i reset() ustawia wewnętrzny wskaźnik z powrotem na pierwszy element w tablicy. Jeśli się mylę lub jeśli masz coś innego lub innego do dodania, powinieneś to zrobić w odpowiedzi, aby wszyscy mogli z tego skorzystać. IMHO, jest to pytanie, z którego może skorzystać większość społeczności, a jeśli się mylę, popraw mnie i opublikuj poprawną odpowiedź
Pieter Goosen