Dlaczego greetUser() bez żadnego argumentu rzuci błąd?
Gdyby ktoś w środku funkcji zmienił wartość $name, czy zmieniłaby się zmienna użyta przy wywołaniu?
Część 1 · Zasięg zmiennej
Dwa zamknięte „pokoje”
Obszar kodu, w którym zmienna istnieje i można jej używać, nazywa się zasięgiem zmiennej. Zmienna zadeklarowana wewnątrz funkcji ma zasięg tylko w jej „pokoju”. Przez mur między pokojami nic nie przechodzi samo, poza dwoma wyjątkami, które już znacie: parametr (wejście) i return (wyjście).
PHP Manual: „The scope of a variable is the context within which it is defined... Any variable created inside a named function or an anonymous function is limited to the scope of the function body” · php.net/manual/en/language.variables.scope.php
Część 2 · Akumulator wewnątrz funkcji
Pętla while z akumulatorem
$sum to akumulator: zmienna, która zbiera wynik po trochu, przy każdym obiegu pętli.
Wynik w przeglądarce:5, potem 100. Funkcja miała swój własny $counter w swoim pokoju; ten na zewnątrz nawet o tym nie wie.
PHP Manual: „This is because the [variable] refers to a local version... it has not been assigned a value within this scope” · php.net/manual/en/language.variables.scope.php
Część 3 · Próba wejścia przez mur
Zmienna z wnętrza funkcji poza nią nie istnieje
functionsumUpTo($upTo) {
$sum = 0;
$i = 1;
while ($i <= $upTo) {
$sum += $i;
$i++;
}
return$sum;
}
echosumUpTo(5) . "<br>";
echo$sum . "<br>"; // $sum tu nie istnieje
Ciekawostka z PHP Manual: to nie zawsze prawda. Słowo static przed deklaracją zmiennej w funkcji sprawia, że taka zmienna zapamiętuje swoją wartość między kolejnymi wywołaniami tej samej funkcji, zamiast znikać po każdym powrocie z return.
ciekawostka: PHP Manual, „A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope” · php.net/manual/en/language.variables.scope.php
Część 4 · Zanim zawołasz o pomoc
Typowe pułapki zasięgu
Sytuacja
Co się dzieje
Poprawka
Odczyt zmiennej z wnętrza funkcji na zewnątrz (echo $sum; po sumUpTo(5))
Warning: Undefined variable $sum - zmienna zniknęła razem z końcem funkcji
Potrzebny wynik zwróćcie przez return i zapiszcie do zmiennej: $result = sumUpTo(5);
Odczyt zmiennej globalnej wewnątrz funkcji bez niczego więcej
Warning: Undefined variable $counter - funkcja domyślnie nie widzi tego, co jest poza nią
Słowo kluczowe global $counter; na początku funkcji „wpuszcza” zmienną globalną do środka
Ta sama nazwa zmiennej globalnie i wewnątrz funkcji
Zmiana jednej nie rusza drugiej - to dwie osobne zmienne o wspólnej nazwie
Nie ma poprawki - to normalne działanie zasięgu, nazwa nie tworzy związku
PHP Manual: „The global keyword is used to bind a variable from a global scope into a local scope” · php.net/manual/en/language.variables.scope.php
2. Zakładając, że zmienne $a, $b, $c przechowują wartości numeryczne, wynikiem działania warunku będzie wypisanie liczby
najmniejszej
największej
nieparzystej
parzystej
CKE, EE.09, styczeń 2021, zadanie 8 · CKE, E.14, wrzesień 2015, zadanie 29
Ćwiczenie przy komputerze · 20 minut
Ćwiczenie: sumUpTo()
W swoim functions.php dopisz funkcję sumUpTo($upTo): $sum = 0, $i = 1, pętla while ($i <= $upTo) z $sum += $i; i $i++;, na końcu return $sum;.
Wywołaj echo sumUpTo(5) . "<br>"; - ma pojawić się 15.
Zaraz pod tym dopisz na chwilę echo $sum; (poza funkcją) i sprawdź, że $sum tam nie istnieje (Warning: Undefined variable). Potem usuń tę linię.
Sprawdź w przeglądarce pod localhost/functions.php, potem zostaw plik w folderze kursu.
Ma się pojawić:15 obok wyników squareArea i greetUser z poprzednich lekcji. Ostrzeżenie Undefined variable widzicie tylko w punkcie 3, potem je usuwacie.
Dla szybkich: dopiszcie w sumUpTo linię global $totalResult; i $totalResult = $sum; przed return. Sprawdźcie, że teraz echo $totalResult; na zewnątrz już działa.
Zasady pracowni
Na koniec
Sprawdź się
Czym różni się zmienna zdefiniowana wewnątrz funkcji od zmiennej zdefiniowanej poza funkcjami?
Co się stanie, gdy poza funkcją spróbujecie użyć zmiennej, która istnieje tylko w jej wnętrzu?
Czy zmienna globalna i zmienna wewnątrz funkcji o tej samej nazwie to jedna i ta sama zmienna?
To zamyka temat funkcji własnych: parametry i return, argumenty i wartości domyślne, zmienne lokalne.
Poza szkołą
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
Zmienne lokalne widoczne tylko wewnątrz jednej funkcji
Dane zamykane we właściwościach obiektu ($this->sum) zamiast luźnych zmiennych - kolejny krok po funkcjach, po temacie klas i obiektów.
nadal w użyciu
Słowo global wpuszczające zmienną globalną do funkcji
W praktyce prawie nieużywane - dane wchodzą przez parametr, wychodzą przez return, tak jak na poprzednich dwóch lekcjach; global utrudnia śledzenie, skąd bierze się wartość.
unikane
Komunikat Warning: Undefined variable widoczny dopiero w przeglądarce
Edytor i narzędzia do statycznej analizy kodu (np. PHPStan) wypisują ten sam błąd, zanim kod w ogóle się uruchomi.