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.php
to 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.
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.
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
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.