Php7 — PHP: global wewnątrz funkcji nie pokazuje zmiennej Zakres zmiennych PHP. Wszystko, co chciałeś wiedzieć, ale bałeś się zapytać. Wydrukuj globalną zmienną PHP poza funkcją

Ostatnia aktualizacja: 11.11.2015

Używając zmiennych i funkcji, należy wziąć pod uwagę zakres zmiennych. Zakres określa zakres działania i dostępność danej zmiennej.

Zmienne lokalne

Zmienne lokalne tworzone są wewnątrz funkcji. Dostęp do takich zmiennych można uzyskać jedynie z poziomu danej funkcji. Na przykład:

W tym przypadku funkcja get() definiuje zmienną lokalną $result . I z ogólnego kontekstu nie możemy uzyskać do tego dostępu, to znaczy napisz $a = $result; Nie jest to możliwe, ponieważ zakres zmiennej $result jest ograniczony przez funkcję get(). Poza tą funkcją zmienna $result nie istnieje.

To samo dotyczy parametrów funkcji: poza funkcją nie istnieją również parametry $lowlimit i $highlimit.

Z reguły zmienne lokalne przechowują pośrednie wyniki obliczeń, jak w powyższym przykładzie.

Zmienne statyczne

Zmienne statyczne są podobne do zmiennych lokalnych. Różnią się tym, że po zakończeniu funkcji zapamiętywana jest ich wartość. Przy każdym wywołaniu funkcja wykorzystuje wcześniej zapisaną wartość. Na przykład:

Aby wskazać, że zmienna będzie statyczna, dodaje się do niej słowo kluczowe static. Po trzech kolejnych wywołaniach metody getCounter() zmienna $counter zostanie zwiększona o jeden.

Jeśli zmienna $counter była zwykłą zmienną niestatyczną, funkcja getCounter() wypisze 1 przy każdym wywołaniu.

Zwykle do tworzenia różnych liczników wykorzystuje się zmienne statyczne, jak w powyższym przykładzie.

Zmienne globalne

Czasami chcesz, aby zmienna była dostępna wszędzie, globalnie. Takie zmienne mogą przechowywać pewne dane wspólne dla całego programu. Aby zdefiniować zmienne globalne, użyj słowa kluczowego global:1

"; ) getGlobal(); echo $gvar; ?>

Po wywołaniu funkcji getGlobal() dostęp do zmiennej $gvar można uzyskać z dowolnej części programu.

Notatka: Aktywowana jest adaptacyjna wersja witryny, która automatycznie dostosowuje się do małego rozmiaru Twojej przeglądarki i ukrywa niektóre szczegóły witryny, aby ułatwić czytanie. Miłego oglądania!

Witajcie drodzy czytelnicy bloga Strona NA! Na zajęciach dowiedzieliśmy się, że w PHP istnieje taka funkcja, dowiedzieliśmy się jak tworzyć własne funkcje, przekazywać do nich argumenty i wywoływać je w celu wykonania. Kontynuując temat funkcji w PHP, należy podkreślić następujące rzeczy:

  • Wewnątrz funkcji można zastosować dowolny kod PHP (cykle, warunki, dowolne operacje), łącznie z innymi funkcjami (zarówno wbudowanymi, jak i niestandardowymi);
  • Nazwa funkcji musi zaczynać się od litery łacińskiej lub znaku podkreślenia, po której następuje dowolna liczba liter łacińskich, cyfr lub znaków podkreślenia;
  • Wszystkie funkcje mają zasięg globalny, co oznacza, że ​​dowolną funkcję można wywołać w dowolnym miejscu, nawet jeśli jest ona zdefiniowana w innej;
  • PHP nie obsługuje przeciążania funkcji, nie ma też możliwości przedefiniowania (zmiany, dodania) lub usunięcia utworzonej funkcji;
  • Funkcje nie muszą być definiowane przed ich użyciem. Oznacza to, że jeśli najpierw wywołasz funkcję, a dopiero potem opiszesz ją w poniższym kodzie, nie wpłynie to na wydajność i nie spowoduje błędów.

Funkcje warunkowe

Możemy stworzyć (definiować, opisać) funkcję w zależności od warunku. Na przykład:

//wywołuje funkcję sayHi, można ją wywołać gdziekolwiek /*nie można tu wywołać funkcji sayGoodbye, ponieważ nie sprawdziliśmy jeszcze warunku i nie weszliśmy do konstrukcji if*/ if($apply)( funkcja powiedzDo widzenia())( echo "Cześć wszystkim!
"; } } /*teraz możemy powiedzieć „do widzenia”*/
"; }

Wynik:

I spójrz na ten przykład:

/*i oto co się stanie, jeśli zadzwonisz i powiesz „do widzenia”*/ Powiedz do widzenia(); if($apply)( funkcja powiedzDo widzenia())( echo "Cześć wszystkim!
"; ) ) funkcja sayHi())( echo "Witajcie wszyscy!
"; }

Wynik:

Tak naprawdę, choć pracuję, nigdy nigdzie nie widziałem czegoś takiego, ale trzeba mieć na uwadze wszystkie możliwości tego języka.

Funkcje zagnieżdżone

Funkcja zagnieżdżona to funkcja zadeklarowana wewnątrz innej funkcji. Przykład:

/*Nie możesz tutaj wywołać metody sayGoodbye, ponieważ pojawi się ona dopiero po wywołaniu funkcji sayHi*/ Powiedz cześć(); /*wywołaj funkcję sayHi, można ją wywołać w dowolnym miejscu*/ /*Teraz możemy powiedzieć „do widzenia”*/ Powiedz do widzenia(); funkcja sayHi())( echo "Witajcie wszyscy!
"; funkcja sayGoodbye())( echo "Cześć wszystkim!
"; } }

Ponownie, przy pierwszym przejściu interpreter PHP zaznacza sam siebie, że znalazł opis funkcji sayHi, ale nie wchodzi do jej treści, widzi tylko nazwę, a ponieważ interpreter nie wchodzi do treści sayHi, wtedy nie ma pojęcia, co definiujemy w ramach innej funkcji – powiedz Goodbye.

Następnie kod zaczyna się wykonywać, wywołujemy sayHi, interpreter PHP musi wejść w treść funkcji sayHi, aby ją wykonać i tam przypadkowo znajduje opis innej funkcji - sayGoodbye, po czym sayGoodbye można wywołać w dowolnym miejscu i tyle razy jak chcesz.

Warto jednak zwrócić uwagę na bardzo subtelny punkt w powyższej sytuacji: funkcja sayHi staje się jednorazowa, ponieważ jeśli wywołamy ją ponownie, PHP ponownie natrafi na definicję funkcji sayGoodbye, a w PHP nie można tego zrobić to - nie możesz zastąpić funkcji. O tym i o tym, jak sobie z tym poradzić, pisałam już w poprzednim artykule.

W PHP opisane powyżej techniki są stosowane bardzo rzadko, częściej można je spotkać np. w JavaScript.

Zmienny zakres

W PHP są dokładnie dwa zakresy: światowy I lokalny. Każdy język programowania ma inne struktury i zakresy. Na przykład w C++ nawet pętle mają swój własny (lokalny) zasięg. Nawiasem mówiąc, w PHP jest to zasięg globalny. Ale dzisiaj mówimy o funkcjach.

Funkcje w PHP mają swój własny zasięg wewnętrzny (lokalny), co oznacza, że ​​wszystkie zmienne wewnątrz funkcji są widoczne tylko w obrębie tej właśnie funkcji.

Zatem jeszcze raz: wszystko poza funkcjami ma zasięg globalny, wszystko wewnątrz funkcji ma zasięg lokalny. Przykład:

Drodzy eksperci, uwaga, pytanie! Co wyświetli ostatnia instrukcja? echo $nazwa; ?

Jak sam zauważyłeś, mieliśmy 2 zmienne $imię, jeden wewnątrz funkcji (zakres lokalny), drugi tylko w kodzie (zakres globalny), ostatnie przypisanie do zmiennej $imię był $name = "Rud Siergiej"; Ale ponieważ znajdował się wewnątrz funkcji, pozostał tam. W zakresie globalnym ostatnim zadaniem było $imię = "Andrzej"; czyli to, co faktycznie widzimy jako rezultat.

Czyli dwie identyczne zmienne, ale w różnych zakresach nie przecinają się i nie wpływają na siebie.

Zilustruję zakres na rysunku:

Podczas pierwszego przejścia interpreter krótko skanuje zasięg globalny, zapamiętuje, jakie tam są zmienne i funkcje, ale nie wykonuje kodu.

Dostęp do zmiennych globalnych z zakresu lokalnego

Ale co, jeśli nadal potrzebujemy dostępu do tej samej zmiennej $name z zakresu globalnego z poziomu funkcji, a nie tylko uzyskać do niej dostęp, ale ją zmienić? Istnieją 3 główne opcje tego. Pierwszy polega na użyciu słowa kluczowego światowy:

"; globalna $nazwa; /*od teraz mamy na myśli zmienną globalną $name*/$name = "Rud Siergiej"; ) $imię = "Andrzej"; powiedz Cześć($imie); echo $nazwa; //?

Wynik:

Ale ta metoda ma wadę, ponieważ uzyskaliśmy dostęp do zmiennej globalnej $imię straciliśmy (nadpisaliśmy) zmienną lokalną $imię.

Drugi sposób jest używać Tablica superglobalna PHP. Sam PHP automatycznie umieszcza w tej tablicy każdą zmienną, którą utworzyliśmy w zasięgu globalnym. Przykład:

$imię = "Andrzej"; //Taki sam jak$GLOBALS["nazwa"] = "Andrzej";

Stąd:

"; $GLOBALS["imię"] = "Rud Siergiej"; ) $imię = "Andriej"; sayHi($imię); echo $imię; // ?

Wynik jest taki sam, jak w przypadku użycia słowa kluczowego światowy:

Tylko tym razem nie przepisaliśmy zmiennej lokalnej, czyli zmiennej $imię wewnątrz funkcji pozostaje taka sama i jest równa „Andriej”, ale nie „Rud Siergiej”.

Przekazywanie argumentów przez referencję

Trzeci sposób– jest to przeniesienie adresu ( spinki do mankietów) zmiennej, a nie jej wartość. Linki w PHP nie są zbyt skuteczne, w przeciwieństwie do innych języków programowania. Podam ci jednak jedyną poprawną opcję przekazywania argumentu przez odwołanie do funkcji, która jest zwykle obsługiwana w PHP 5.3 i nowszych wersjach. Istnieją inne sposoby pracy z linkami, ale działały one w PHP 5.2 i niższych, w wyniku czego sami programiści PHP postanowili je porzucić, więc nie będziemy o nich rozmawiać.

Zatem PRAWIDŁOWE przekazanie argumentu przez referencję w PHP 5.3 i nowszych wersjach odbywa się w następujący sposób:

Funkcja sayHi(& $imie)(

W samym opisie funkcji dodaliśmy ikonę ampersandu (&) - ikona ta oznacza, że ​​nie akceptujemy wartości zmiennej, a jedynie odnośnik (adres) do tej wartości w pamięci. Referencje w PHP umożliwiają utworzenie dwóch zmiennych wskazujących tę samą wartość. Oznacza to, że gdy zmienia się jedna z tych zmiennych, zmieniają się obie, ponieważ odnoszą się do tej samej wartości w pamięci.

I na koniec mamy:

//zaakceptuj nie wartość, ale odwołanie do wartości echo "Witam, ".$imie."!
"; $imię = "Rud Siergiej"; ) $imie = "Andriej"; sayHi($imię); echo $imię; // ?

Wynik:

Zmienne statyczne

Wyobraźmy sobie następującą sytuację: musimy policzyć, ile razy w sumie się przywitaliśmy. Oto, co próbujemy zrobić:

"; $c++; //zwiększ licznik o 1


Wynik:

Zmienny $c nie pamięta swojego znaczenia, za każdym razem tworzy się na nowo. Musimy utworzyć naszą zmienną lokalną $c zapamiętywali jej wartość po wykonaniu funkcji, w tym celu używają słowa kluczowego statyczny:

// licznik, statyczny echo "Witam, ".$imie."!
"; $c++; //zwiększ licznik o 1 echo "Właśnie się przywitałem". $c. " raz.


"; ) powiedz Cześć("Rud Siergiej"); powiedz Cześć("Andriej"); powiedz Cześć("Dmitry");

Wynik:

Zwracanie wartości

Funkcje mają tak wygodną funkcję, jak zwracanie wartości. Dzieje się tak wtedy, gdy funkcja zamiast wyświetlać coś na ekranie, umieszcza wszystko w zmiennej i przekazuje nam tę zmienną. I już decydujemy, co z tym zrobić. Weźmy na przykład tę funkcję, która podnosi liczbę do kwadratu:

Wynik:

Zróbmy to tak, aby zamiast wyświetlać to na ekranie, zwracał wynik wykonania. Aby to zrobić, użyj słowa kluczowego return:

Wynik:

Teraz możemy to wykorzystać na różne sposoby:

//wypisuje wynik Echo "
"; $num = getSquare(5); echo $num;

Wynik:

Należy pamiętać, że słowo kluczowe powrót nie tylko zwraca wartość, ale całkowicie przerywa funkcję, czyli cały kod znajdujący się pod słowem kluczowym powrót nigdy nie zostanie spełniony. Innymi słowy, powrót do funkcji również działa podobnie przerwa dla pętli:

echo "PHP nigdy do mnie nie dotrze :(";) echo getSquare(5); //wypisuje wynik Echo "
"; $num = getSquare(5); // przypisał wynik do zmiennej echo $liczba; // wyświetl zmienną na ekranie

Wynik:

To jest powrót– jest to jednocześnie wyjście z funkcji. Można go używać bez wartości zwracanej, tylko ze względu na dane wyjściowe.

Funkcja rekurencyjna

Funkcja rekurencyjna to funkcja, która wywołuje samą siebie. Rekurencja nie jest często używana i jest uważana za operację wymagającą dużych zasobów (powolną). Ale zdarza się, że użycie rekurencji jest najbardziej oczywistą i prostą opcją. Przykład:

"; if($liczba< 20){ // aby rekurencja nie stała się nieskończona policzProszę(++$liczba); // funkcja countPlease wywołała samą siebie) ) policzProszę(1);

Wynik:

Jeśli wiesz, jak obejść się bez rekurencji, lepiej to zrobić.

Silne pisanie w PHP (udoskonalanie typu)

PHP małymi krokami zmierza w kierunku silnego typowania, dzięki czemu możemy z góry określić, jaki typ powinna przyjmować funkcja (jest to tzw wskazówka typu):

Wynik:

Łagodny błąd krytyczny: Argument 1 przekazany do funkcji countPlease() musi być tablicą, podaną liczbą całkowitą, wywoływaną w /home/index.php w linii 7 i zdefiniowaną w /home/index.php w linii 3

Błąd informuje nas, że funkcja oczekuje tablicy, ale zamiast tego przekazujemy jej liczbę. Niestety na razie możemy określić tylko typ dla (tablica), a w PHP 5.4 dodaliśmy także taką opcję jak możliwy do wywołania:

Możliwość wywołania sprawdza, czy przekazana wartość może zostać wywołana jako funkcja. Wywoływalna może być nazwą funkcji określoną przez zmienną łańcuchową lub obiektem i nazwą wywoływanej metody. Ale o obiektach i metodach porozmawiamy później (jest to część programowania obiektowego), ale funkcje już znasz. Efektu pracy nie mogę pokazać, gdyż aktualnie posiadam PHP 5.3, ale wyglądałoby to tak:

Nazywa się funkcją getEcho

Używanie argumentów o zmiennej długości

I na koniec jeszcze jeden bardzo rzadko używany niuans. Wyobraźmy sobie sytuację: przekazujemy do funkcji argumenty, choć w funkcji ich nie opisaliśmy, np.:

Wynik:

Jak widać, nie ma błędów, ale nasze przekazane argumenty nie są nigdzie używane. Ale to nie znaczy, że zniknęły - nadal zostały przekazane do funkcji i możemy z nich skorzystać; są do tego wbudowane funkcje PHP:

func_num_args()- Zwraca liczbę argumentów przekazanych do funkcji
func_get_arg(numer kolejny)- Zwraca element z listy argumentów
func_get_args()- Zwraca tablicę zawierającą argumenty funkcji

"; echo func_get_arg(0) ; ) $wiek = 22; getEcho("Rud Siergiej", $wiek);

Wynik:

Wniosek

Dzisiejszy artykuł jest ostatnim na temat funkcji w PHP. Teraz możesz być pewien kompletności swojej wiedzy na ten temat i śmiało możesz wykorzystać funkcje dla swoich potrzeb.

Jeśli ktoś chce być w tym lepszy, ale nie ma pojęcia jak to zrobić, najlepszym sposobem będzie napisanie gotowych (wbudowanych) funkcji PHP, np. można napisać własną funkcję count() lub jakikolwiek inny.

Dziękuję wszystkim za uwagę i do zobaczenia ponownie! Jeśli coś nie jest jasne, śmiało zadawaj pytania w komentarzach!

W tym samouczku omówimy zakres zmiennych PHP. Wyjaśnia różnicę między zasięgiem lokalnym i globalnym, pokazuje, jak uzyskać dostęp do zmiennych globalnych w ramach funkcji, jak pracować z superglobalami i tworzyć zmienne statyczne.

Kiedy zaczynasz uczyć się PHP i zaczynasz pracować z funkcjami i obiektami, zakres zmiennych jest nieco mylący. Na szczęście zasady PHP w tym zakresie są bardzo łatwe do zrozumienia (w porównaniu do innych języków programowania).

Co to jest zakres?

Zakres zmiennych to kontekst, w którym zmienna została zdefiniowana i gdzie można uzyskać do niej dostęp. PHP ma dwa zakresy zmiennych:

  • Światowy- dostęp do zmiennych można uzyskać w dowolnym miejscu skryptu
  • Lokalny- dostęp do zmiennych można uzyskać tylko wewnątrz funkcji, w której zostały zdefiniowane

Zasięg zmiennej, zwłaszcza lokalnej, znacznie ułatwia zarządzanie kodem. Gdyby wszystkie zmienne były globalne, można je było zmienić w dowolnym miejscu skryptu. Prowadziłoby to do chaosu i dużych skryptów, ponieważ bardzo często w różnych częściach skryptu używane są zmienne o tych samych nazwach. Ograniczając zakres do kontekstu lokalnego, definiujesz granice kodu, który może uzyskać dostęp do zmiennej, co sprawia, że ​​kod jest solidniejszy, modułowy i łatwiejszy do debugowania.

Zmienne o zasięgu globalnym nazywane są globalnymi, a zmienne o zasięgu lokalnym nazywane są lokalnymi.

Oto przykład działania zmiennych globalnych i lokalnych.

"; ) sayHello(); echo "Wartość \$globalName: "$globalName"
"; echo "\$localName wartość: "$localName"
"; ?>

Cześć Harry! Wartość $globalName: „Zoe” Wartość $localName: „”

W tym skrypcie utworzyliśmy dwie zmienne:

  • $globalna nazwa- Ten światowy zmienny
  • $Nazwalokalna- Ten lokalny zmienna tworzona wewnątrz funkcji sayHello().

Po utworzeniu zmiennej i funkcji skrypt wywołuje metodę sayHello(), która wyświetla komunikat „Hello Harry!” . Następnie skrypt próbuje wyprowadzić wartości dwóch zmiennych za pomocą funkcji echo. Oto, co się dzieje:

  • Ponieważ $globalna nazwa został utworzony poza funkcją, jest dostępny w dowolnym miejscu skryptu, więc wyprowadzane jest „Zoe”.
  • $Nazwalokalna będzie dostępna tylko wewnątrz funkcji sayHello(). Ponieważ wyrażenie echo znajduje się poza funkcją, PHP nie zapewnia dostępu do zmiennej lokalnej. Zamiast tego PHP oczekuje, że kod utworzy nową zmienną o nazwie $localName , która będzie miała domyślną wartość w postaci pustego ciągu znaków. dlatego drugie wywołanie echo zwraca wartość „” dla zmiennej $localName.

Dostęp do zmiennych globalnych wewnątrz funkcji

Aby uzyskać dostęp do zmiennej globalnej nie działa Wystarczy napisać jej imię. Ale aby uzyskać dostęp do zmiennej globalnej wewnątrz funkcji, musisz najpierw zadeklarować zmienną jako globalną w funkcji, używając słowa kluczowego global:

Funkcja myFunction() ( global $globalVariable; // Uzyskaj dostęp do zmiennej globalnej $globalVariable )

Jeśli tego nie zrobisz, PHP zakłada, że ​​tworzysz lub używasz zmiennej lokalnej.

Oto przykładowy skrypt wykorzystujący zmienną globalną wewnątrz funkcji:

"; global $globalName; echo "Witaj $globalName!
"; ) powiedz cześć(); ?>

Po wykonaniu skrypt wyświetli:

Cześć Harry! Witaj Zojo!

Funkcja sayHello() używa słowa kluczowego global do zadeklarowania zmiennej $globalName jako globalnej. Następnie może uzyskać dostęp do zmiennej i wypisać jej wartość („Zoe”).

Kim są superglobaliści?

PHP ma specjalny zestaw predefiniowanych tablic globalnych, które zawierają różne informacje. Takie tablice nazywane są superglobaliści, ponieważ są one dostępne z dowolnego miejsca w skrypcie, łącznie z wewnętrzną przestrzenią funkcji, i nie muszą być definiowane przy użyciu słowa kluczowego global.

Oto lista superglobalów dostępnych w wersji PHP 5.3:

  • $GLOBALS - lista wszystkich zmiennych globalnych w skrypcie (z wyjątkiem superglobalnych)
  • $_GET - zawiera listę wszystkich pól formularza przesłanych przez przeglądarkę za pomocą żądania GET
  • $_POST - zawiera listę wszystkich pól formularza wysłanych przez przeglądarkę za pomocą żądania POST
  • $_COOKIE - zawiera listę wszystkich plików cookies wysłanych przez przeglądarkę
  • $_REQUEST - zawiera wszystkie kombinacje klucz/wartość zawarte w tablicach $_GET, $_POST, $_COOKIE
  • $_FILES - zawiera listę wszystkich plików pobranych przez przeglądarkę
  • $_SESSION - umożliwia przechowywanie i używanie zmiennych sesyjnych dla bieżącej przeglądarki
  • $_SERVER - zawiera informacje o serwerze, takie jak nazwa pliku wykonywanego skryptu oraz adres IP przeglądarki.
  • $_ENV - zawiera listę zmiennych środowiskowych przekazywanych do PHP, takich jak zmienne CGI.
Na przykład możesz użyć $_GET, aby pobrać wartości zmiennych zawarte w ciągu adresu URL żądania skryptu i wyświetlić je na stronie:

Jeśli uruchomisz powyższy skrypt, używając adresu URL http://www.example.com/script.php?yourName=Fred, wyświetli się:

Witaj Fred!

Ostrzeżenie! W prawdziwym skrypcie takiego przesyłania danych nigdy nie należy stosować ze względu na słabe bezpieczeństwo. Zawsze należy sprawdzać poprawność lub filtrować dane.

Superglobalna $GLOBALS jest bardzo wygodna w użyciu, ponieważ pozwala zorganizować dostęp do zmiennych globalnych w funkcji bez potrzeby stosowania słowa kluczowego global. Na przykład:

"; ) sayHello(); // Drukuje "Witam, Zoya!" ?>

Zmienne statyczne: gdzieś są

Kiedy tworzysz zmienną lokalną wewnątrz funkcji, istnieje ona tylko wtedy, gdy funkcja jest uruchomiona. Po zakończeniu funkcji zmienna lokalna znika. Po ponownym wywołaniu funkcji tworzona jest nowa zmienna lokalna.

W większości przypadków działa to świetnie. Zatem funkcje są samodzielne i zawsze działają tak samo przy każdym wywołaniu.

Są jednak sytuacje, w których wygodnie byłoby utworzyć zmienną lokalną, która „pamięta” swoją wartość pomiędzy wywołaniami funkcji. Taka zmienna nazywana jest statyczną.

Aby utworzyć zmienną statyczną w funkcji, należy użyć słowa kluczowego static przed nazwą zmiennej i pamiętać o nadaniu jej wartości początkowej. Na przykład:

Funkcja myFunction() ( statyczna $myVariable = 0; )

Rozważmy sytuację, w której wygodnie jest użyć zmiennej statycznej. Załóżmy, że tworzysz funkcję, która po wywołaniu tworzy widżet i wyświetla liczbę już utworzonych widżetów. Możesz spróbować napisać taki kod, używając zmiennej lokalnej:


"; echo createWidget() . " już utworzyliśmy.
"; echo createWidget() . " już utworzyliśmy.>
"; ?>

Ponieważ jednak przy każdym wywołaniu funkcji tworzona jest zmienna $numWidgets, otrzymamy następujący wynik:

Tworzymy kilka widżetów... Stworzyliśmy już 1. Stworzyliśmy już 1. Stworzyliśmy już 1.

Ale używając zmiennej statycznej, możemy przechowywać wartość z jednego wywołania funkcji do drugiego:

"; echo createWidget() . " już utworzyliśmy.
"; echo createWidget() . " już utworzyliśmy.
"; echo createWidget() ." >już utworzyliśmy.
"; ?>

Teraz skrypt wygeneruje oczekiwany wynik:

Tworzymy kilka widżetów... Stworzyliśmy już 1. Stworzyliśmy już 2. Stworzyliśmy już 3.

Chociaż zmienna statyczna zachowuje swoją wartość pomiędzy wywołaniami funkcji, jest ważna tylko wtedy, gdy skrypt jest uruchomiony. Po zakończeniu wykonywania skryptu wszystkie zmienne statyczne są niszczone, podobnie jak zmienne lokalne i globalne.

To wszystko! Proszę często zaglądać do dokumentacji PHP.

Należy tutaj zauważyć, że przedstawiony element kodu należy uznać za zły projekt i styl programowania, ponieważ traktuje dołączony plik jako natychmiast wykonywalny zestaw operacji.

Najbardziej poprawnym podejściem byłoby umieszczenie zestawu operacji jako funkcji/klas z własną nazwą w pliku, dołączenie pliku (bez instrukcji return poza funkcjami), a następnie wywołanie funkcji oczywiście z wymaganym zestawem argumentów.

Więc w czym problem?

Wszystko jest niezwykle proste, robisz to włączać wewnątrz metody metoda, co oznacza, że ​​w zakresie metody inicjowane są zmienne określone w załączonym pliku metoda. Dlatego zmienna $lang nie jest globalny i jest ograniczone widocznością metody i uzyskujesz dostęp do zmiennej globalnej, więc używając modyfikatora światowy będzie równa zero.

Jeśli uwzględnisz w zasięgu globalnym, wówczas zmienna lang stanie się publiczna (globalna) i możliwe stanie się jej użycie. Łatwo to sprawdzić, w załączonym pliku, przed przystąpieniem do definiowania jakiejkolwiek zmiennej, wystarczy wpisać globalna zmienna $.

Przykład:

dołącz „plik1.php”; funkcja include2() (włącz "plik2.php"; )
  • plik1.php jest zdefiniowany w zakresie globalnym.
  • plik2.php jest zdefiniowany w lokalnym zakresie funkcji include2.

Podejście ze zmiennymi globalnymi i takimi jak m.in. jest podporą, która przyniesie problemy w przyszłości. Funkcje muszą być jawnie zdefiniowane, mieć unikalną nazwę i być wykonywane na żądanie.

Dlaczego podejście ze zmiennymi globalnymi jest złe?

Chodzi o to, że zmienne globalne są widoczne z każdego miejsca, globalnie. Jest to wygodne: nie ma żadnych ograniczeń. Z drugiej strony śledzenie, kto zmienia dane, staje się całkowicie niemożliwe. Niekontrolowane zmiany to pierwsza rzecz, która zwykle przychodzi na myśl, gdy pytamy, dlaczego zmienne globalne są złe.

Załóżmy, że masz funkcję, której wynik zależy od zmiennej globalnej. Wołasz, dzwonisz, ale po 10 minutach funkcja zaczyna zwracać nieprawidłowe wyniki. Co się stało? W końcu przekazujesz mu ten sam zestaw parametrów jako dane wejściowe? Hmm, ktoś zmienił wartość zmiennej globalnej... Kto to może być? Tak, każdy - wszak zmienna globalna jest dostępna dla każdego..

Najlepszy przepis na projektowanie podprogramów to: spraw, aby wynik funkcji zależał tylko od argumentów. To ideał, do którego należy dążyć.

Nie używaj niepotrzebnie zmiennych globalnych w swoim projekcie, skorzystaj ze wszystkich funkcji zasięgu lokalnego, przekazując parametry do argumentów funkcji, a kod będzie łatwiejszy do napisania, utrzymywania i testowania.

Czy wiesz, jaki jest najlepszy przedrostek dla zmiennych globalnych?

Zmienne zdefiniowane w ramach podprogramu (funkcja zdefiniowana przez użytkownika). Są one dostępne wyłącznie w obrębie funkcji, w której zostały zdefiniowane.

W PHP wszystkie zmienne zadeklarowane i użyte w funkcji są domyślnie lokalne dla tej funkcji. Oznacza to, że domyślnie nie jest możliwa zmiana wartości zmiennej globalnej w treści funkcji.

Jeżeli w treści funkcji użytkownika użyjesz zmiennej o nazwie identycznej z nazwą zmiennej globalnej (znajdującej się poza funkcją użytkownika), to ta zmienna lokalna nie będzie miała żadnego związku ze zmienną globalną. W tej sytuacji w funkcji użytkownika zostanie utworzona zmienna lokalna o nazwie identycznej z nazwą zmiennej globalnej, ale ta zmienna lokalna będzie dostępna tylko w ramach tej funkcji użytkownika.

Wyjaśnijmy ten fakt na konkretnym przykładzie:

$a = 100;

funkcja funkcja() (
$a = 70;
Echo "

$a

" ;
}
funkcjonować();
Echo "

$a

" ;
?>

Skrypt wydrukuje najpierw 70, a następnie 100:

70
100

Aby pozbyć się tej wady, istnieje specjalna instrukcja w PHP światowy, umożliwiając funkcji zdefiniowanej przez użytkownika pracę ze zmiennymi globalnymi. Przyjrzyjmy się tej zasadzie na konkretnych przykładach:

$a = 1;
$b = 2;

Funkcja Suma()
{
globalne $a, $b;

$b = $a + $b;
}

Suma();
echo $b;
?>

Powyższy skrypt wyświetli „ 3 „. Po zdefiniowaniu $a I $b wewnątrz funkcji jak światowy wszystkie odniesienia do którejkolwiek z tych zmiennych będą wskazywać na ich wersję globalną. Nie ma ograniczeń co do liczby zmiennych globalnych, które mogą być obsługiwane przez funkcje zdefiniowane przez użytkownika.

Drugim sposobem uzyskania dostępu do zmiennych o zasięgu globalnym jest użycie specjalnej tablicy zdefiniowanej w PHP $GLOBALNI. Poprzedni przykład można przepisać w następujący sposób:

Używanie $GLOBALS zamiast globalnego:

$a = 1;
$b = 2;

Funkcja Suma()
{
$GLOBALS [ „b” ] = $GLOBALS [ „a” ] + $GLOBALS [ „b” ];
}

Suma();
echo $b;
?>

$GLOBALNI jest tablicą asocjacyjną, której kluczem jest nazwa, a wartością jest zawartość zmiennej globalnej. Należy pamiętać, że $GLOBALS istnieje w dowolnym zakresie, ponieważ jest to tablica. Poniżej przykład demonstrujący możliwości superglobalistów:

funkcja test_global()
{
// Większość predefiniowanych zmiennych nie jest
// „super” i być dostępnym w okolicy
// widoczność funkcji wymaga określenia „globalnego”.
globalny $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS["nazwa"];

// Superglobale są dostępne w dowolnym zakresie
// widoczność i nie wymagają określenia „globalnego”.
// Superglobale dostępne od PHP 4.1.0
echo $_POST ["nazwa"];
}
?>