WordPress

php — Jak ustawić i używać zmiennych globalnych? Albo dlaczego w ogóle z nich nie korzystać

  • 4 marca, 2013
  • 5 min read
php — Jak ustawić i używać zmiennych globalnych?  Albo dlaczego w ogóle z nich nie korzystać


Chociaż zdecydowanie odradzam to i tak będzie nie przyspieszyć działanie, Twoje użycie jest nieprawidłowe.

WordPress już buforuje te rzeczy w pamięci podręcznej/pamięci obiektów, więc nie musi pobierać ich wielokrotnie w tym samym żądaniu, nie musisz przechowywać wyniku i używać go ponownie, WP robi to już po wyjęciu z pudełka.

Jest bardzo prawdopodobne, że Twój kod jest uruchomiony wolniej w wyniku tej mikrooptymalizacji, a nie szybciej!

Jak korzystać z globali

Kiedy próbujesz użyć globala, musisz określić global najpierw słowo kluczowe. Określiłeś ją tutaj podczas definiowania jej wartości, ale poza tym zakresem należy ją ponownie zadeklarować jako zmienną o zasięgu globalnym.

np. w functions.php :

    function test() {
        global $hello;
        $hello = 'hello world';
    }
    add_action( 'after_setup_theme', 'test' );

W single.phpto nie zadziała:

    echo $hello;

Ponieważ $hello jest nieokreślony. To jednak będzie praca:

    global $hello;
    echo $hello;

Oczywiście, nie powinieneś robić żadnego z nich. WordPress już próbuje buforować te rzeczy w pamięci podręcznej obiektów.

Wady i zagrożenia zmiennych globalnych

Wykonanie tej czynności nie spowoduje wzrostu prędkości (możesz zauważyć niewielki spadek prędkości), jedyne, co otrzymasz, to dodatkowa złożoność i konieczność wpisania wielu globalnych deklaracji, które nie są konieczne.

Warto przeczytać!  Jak przyspieszyć motyw WordPress WooCommerce

Spotkasz także inne problemy:

  • kod, dla którego nie da się napisać testów
  • kodu, który zachowuje się inaczej przy każdym uruchomieniu
  • koliduje w nazwach zmiennych ze współdzielonej przestrzeni nazw
  • przypadkowe błędy spowodowane zapomnieniem o zadeklarowaniu global
  • całkowity brak struktury przechowywania danych kodów
  • i wiele więcej

Czego powinieneś użyć zamiast tego?

Lepiej będzie, jeśli użyjesz danych strukturalnych, takich jak obiekty lub wstrzykiwanie zależności, lub w twoim przypadku zestawu funkcji.

Oto 3 alternatywy:

Zmienne statyczne

Zmienne statyczne nie są dobre, ale pomyśl o nich jako o nieco mniej złym kuzynie zmiennych globalnych. Zmienne statyczne mają się do zmiennych globalnych, tym czym chleb pokryty błotem ma się do cyjanku.

Na przykład tutaj jest sposób na zrobienie czegoś podobnego za pomocą zmiennych statycznych, np

    function awful_function( $new_hello='' ) {
        static $hello;
        if ( !empty( $new_hello ) ) {
            $hello = $new_hello;
        }
        return $hello;
    }

    awful_function( 'telephone' );
    echo awful_function(); // prints telephone
    awful_function( 'banana');
    echo awful_function(); // prints banana

Należy pamiętać, że istnieją inne powody, dla których warto używać zmiennych statycznych, niezwiązanych z buforowaniem i wydajnością, ale mają one swoje wady. Prawidłowe napisanie testów funkcji przy użyciu zmiennej statycznej jest trudne, jeśli nie niemożliwe, i znacznie utrudnia debugowanie, ponieważ trzeba śledzić wartość tej zmiennej.

Warto przeczytać!  jquery — chcę uruchomić zapytanie Sql w skrypcie, jak mogę to zrobić

W dobrym kodzie czysta funkcja zawsze robi to samo, gdy ma te same parametry. Funkcje czyste są przewidywalne i łatwe do napisania testów. Funkcja ze zmienną statyczną nigdy nie może być funkcją czystą.

Singletony

Singletony to obiekty, które są tworzone raz i może istnieć tylko jedna instancja tego obiektu. Są tak samo złe jak zmienne globalne, tylko mają inną składnię, mają te same problemy co zmienne statyczne i dają pozory programowania obiektowego bez żadnych korzyści. Unikaj ich.

Dalsza lektura:

WP_Cache, rzecz, którą próbowałeś zrobić, ale WP już to robi

Jeśli naprawdę chcesz zaoszczędzić czas, przechowując dane w miejscu do ponownego wykorzystania, rozważ użycie WP_Cache układ z wp_cache_get itp. np

$value = wp_cache_get( 'hello' );
if ( false === $value ) {
    // not found, set the default value
    wp_cache_set( 'hello', 'world' );
}

Teraz wartość będzie buforowana przez cały czas trwania żądania przez WordPress, pojawi się w narzędziach do debugowania, a jeśli masz pamięć podręczną obiektów, będzie ona zachowywana między żądaniami.

Czy to oznacza, że ​​muszę użyć wp_cache_get w moim kodzie?

Prawdopodobnie nie, WordPress robi to już automatycznie dla postów/użytkowników/meta/terms/opcji/etc, więc nigdy nie musisz przechowywać ani pobierać danych postów w ten sposób. Po prostu użyj normalnych funkcji API, a zrobi to automatycznie za kulisami.


Przypis 1: Chciałbym zauważyć, że niektórzy ludzie próbują utrwalać dane w zmiennych globalnych w żądaniach, nieświadomi, że PHP nie tak działa. W przeciwieństwie do aplikacji Node, każde żądanie ładuje nową kopię aplikacji, która następnie umiera po zakończeniu żądania. Z tego powodu zmienne globalne ustawione w jednym żądaniu nie przetrwają do następnego żądania

Warto przeczytać!  WooCommerce — lista rozwijana odmian z niestandardowym atrybutem

Sidenote 2: Sądząc po zaktualizowanym pytaniu, zmienne globalne nie dają żadnego wzrostu wydajności. Zamiast tego powinieneś generować kod HTML wtedy, gdy go potrzebujesz, a będzie on działał równie szybko, a może nawet trochę szybciej. To jest mikrooptymalizacja.


Źródło