Funkcje

Funkcje służą ponownemu użyciu kodu. Wykorzystanie funkcji jest jeszcze bardziej powszechne niż można by było sobie wyobrazić rozpoczynając naukę programowania. Mamy wiele funkcji wbudowanych tak jak isset() czy filter_input(), ale możemy także pisać własne o czym właśnie jest ta część kursu.

Funkcja hello_world

Napiszmy najprostszą możliwą funkcję.

function hello_world(){
    echo "Hello world ";
}
hello_world();
hello_world();

Funkcja w powyższym przykładzie po prostu wyświetla napis „hello world”, wykorzystaliśmy ją dwa razy, a więc uzyskamy dwa napisy „Hello world”.

Budowa funkcji jest prosta, najpierw piszemy słowo kluczowe function po nim nazwę funkcji i nawiasy okrągłe a następnie otwieramy blok kodu gdzie możemy wpisać dowolny kod, którego następnie będziemy mogli użyć gdziekolwiek zechcemy wpisując po postu nazwę funkcji z nawiasami okrągłymi. Należy pamiętać że nazwa funkcji musi być unikalna w obrębie programu, przy dużych programach mogłoby to być kłopotliwe, ale jak później się dowiemy zostało to rozwiązane przez klasy, obiekty i przestrzenie nazw.

Argumenty

Funkcje, które po prostu coś robią/wyświetlają są wykorzystywana ale nie najczęściej. Przeważnie funkcje pobierają jakieś argumenty a następnie zwracają wartości.

function second_function($changed_value = 2){
    if($changed_value == 1){
        return "Wybrano jeden";
    } else {
        return "Nie wybrano jeden";
    }
}
echo second_function();

W powyższym przykładzie stworzyliśmhy funkcję, która pobiera jako argument jakąś zmienną. Następnie sprawdza czy ta zmienna jest równa jeden i jeśli jest równa to zwraca ciąg znaków „Wybrano jeden” a jeśli nie to „Nie wybrano jeden”. Następnie wywołujemy funkcję podając jej jako argument wartość jeden, w tym momencie wartość jest przypisywana do zmiennej $changed_value w naszej funkcji a następnie sprawdzana. Przy pierwszym użyciu funkcja powie nam że wybrano jeden zgodnie z prawdą w drugim nie. (czy to nie wspaniałe że komputery nie kłamią 😉 )

Tutaj zwróćmy uwagę na to że aby zwrócić wynik działania funkcji wykorzystujemy słowo kluczowe return, po zwróceniu wartości przez funkcję wykonywanie funkcji jest przerywane i po return już nic się nie dzieje (w obrębie bloku kodu funkcji oczywiście)

W powyższym przykładzie jesli nie przekażemy funkcji żadnego argumentu otrzymamy błąd, ale możemy także ustawić wartość domyślną.

function second_function($value1, $changed_value = 2){
    if($changed_value == 1 && $value1 ==1){
        return "Wybrano jeden i jeden";
    } else {
        return "Nie wybrano jeden i jeden";
    }
}
$i = 1;
echo second_function($i,1);

W tym przykładzie ustawiliśmy wartość domyślną na dwa, tak więc jeśli wykorzystując funkcję nie przekażemy żadnej wartości, funkcja zwróci „nie wybrano jeden”, oczywiście jeśli przekażemy wartość „1”, to zostanie zwrócony poprawny napis.

Oczywiście możemy przekazywać więcej argumentów umieszczając je po przecinku, możemy także wartości funkcjom przekazywać za pomocą zmiennych jak w przykładzie poniżej. Musimy pamiętać jednak aby w pierwszej kolejności umieszczać argumenty bez wartości domyślnej, w drugiej kolejności argumenty z określoną wartością domyślną. Jeżeli stworzymy funkcję gdzie jeden argument nie będzie miał ustalonej wartości domyślnej a drugi będzie to jak przekażemy tylko jedną wartość domyślną funkcja się wykona.

$i = 1;
third_function();
echo $i;
function third_function(){
    $i++;
}

Referencje

Nieco bardziej zaawansowane jest przekazywanie przez referencję. Ogólnie zmienne nie są dostępne wewnątrz funkcji i tak na przykład.

$i = 1;
third_function($i);
echo $i;
function third_function(&$i){
    $i++;
}

Powyższy przykład da nam co najwyżej błąd, aby zmienić wartość zmiennej nie przypisując jej wartości zwracanej przez funkcję (bo przecież może być kilka argumentów a zwrócić możemy co najwyżej jedną zmienną) należy wykorzystać referencję.

$i = 1;
third_function($i);
echo $i;
function third_function(&$i){
    $i++;
}

W powyższym przykładzie jako argument ustawiliśmy &$i, tutaj znak & tworzy referencję, oznacza to że cokolwiek zrobimy z przekazaną zmienną wewnątrz funkcji stanie się to z nią także poza funkcją.

Zmienne globalne

Ogólnie wewnątrz funkcji nie mamy dostępu do zmiennych poza funkcją, ale możemy to zmienić wykorzystując słowo kluczowe global. Wykorzystujemy tę funkcjonalność przeważnie do uzyskania ogólnodostępnych informacji w systemie jak na przykład dane konfiguracyjne.

$i = 1;
$j = 2;
$res = fourth_function();
echo $res;
function fourth_function(){
    global $i;
    return $i;
}

W tym przykładzie definiujemy dwie zmienne przed użyciem czwartej funkcji. Wewnątrz funkcji po słowie global dajemy zmienną $i. W ten sposób uzyskujemy dostęp do zmiennej, którą wcześniej zdefiniowaliśmy, oraz zwracamy tę zmienną. Wewnątrz funkcji nie będziemy mieli dostępu do zmiennej $j, która nie została określona po słowie kluczowym global.

Typy argumentów

Od PHP 7 czyli całkiem niedawna można deklarować również typy oczekiwanych argumentów.

function fifth_function(int $number){
    return $number;
}

W powyższym przykładzie oczekujemy że funkcja otrzyma parametr w postaci liczby całkowitej. Najczęściej wykorzystywane typy to:

  • string – ciąg znaków
  • float – liczba zmienno przecinkowa np 0.1
  • Bool – wartość logiczna true lub false
  • array – tablica
  • nazwa klasy obiektu – funkcja będzie oczekiwała parametru w postaci obiektu utworzonego na podstawie podanej klasy

Od wersji PHP 7.4 przed typem oczekiwanego parametru można umieścić znak zapytania. Oznacza to że funkcja oczekuje parametru o zdefiniowanym typie lub wartości pustej (null).

Ananlogicznie możemy określić typ zwracanej wartości przez funkcję. Tutaj dodatkowo można określić, że funkcja nie powinna zwracać żadnego parametru poprzez słowo void. Kod będzie wyglądał następująco:

function my_function(int $number) :?float {
    return $number*0.5;
}

W powyższym przykładzie będziemy się spodziewać że funkcja zwróci liczbę zmiennoprzecinkową lub wartość pustą (null)

Wartości domyślne

Dla parametrów funkcji można ustalić wartości domyślne dzięki czemu stają się nie obowiązkowe. Należy także pamiętać że parametry ze zdefiniowanymi wartościami domyślnymi umieszcza się na końcu. Wynika to z tego że jeśli nie zostaną wpisane wartości nieobowiązkowe to te wpisane zostałyby potraktowane jako obowiązkowe.

function my_function(int $number, float $numberTwo = 2) :?float {
    return $number*$numberTwo;
}

W powyższym przykładzie mamy jeden parametr obowiązkowy i jedne nie obowiązkowy.

Rekurencja

Rekurencja to zabieg polegający na wykorzystaniu funkcji wewnątrz tej samej funkcji. Nie należy jej mylić z Referencją. Jest dość rzadko wykorzystywany zabieg jednak, czasami okazuje się bardzo pomocny na przykład przy budowaniu drzewa kategorii.

Przy wykorzystaniu rekurencji trzeba być bardzo ostrożnym i zdefiniować wewnątrz funkcji odpowiednie warunki, ponieważ w bardzo łatwy sposób można doprowadzić do zapętlenia programu i jego zawieszenia.

function power_function(int $number, int $power) :int {
    if($power > 1){
        return power_function($number, $power - 1)*$number;
    } else if($power == 1) {
        return $number;
    } else {
        return 1;
    }
}

Powyższa funkcja oblicza potęgę liczby przekazanej jako pierwszy parametr podniesionej o drugi parametr. (przy założeniu że liczba jest dodatnia) Ważny tutaj jest warunek powodujący zwrócenie liczby gdy potęga jest już mniejsza od 2, oraz obniżenie potęgi przy każdym zagłębieniu rekurencji, dzięki czemu program się nie zapętli.

Funkcje wbudowane

PHP ma całą masę funkcji wbudowanych. Między innymi funkcja podobna do tej powyżej oblicząjąca potęgę liczby (pow($x, $y)). Praktycznie wszystkie można znaleźć w manualu na php.net. Najczęściej wykorzystywane to prawdopodonie:

  • empty($par) – sprawdza czy $par nie jest pusty, zwraca wartość logiczną.
  • isset($par) – sprawdza czy parametr istnieje (został zdefiniowany)

Często się jeszcze wykorzystuje explode() do dzielenia ciągu znaków na tablicę, implode do spajania tablicy. itd. Więcej funkcji wbudowanych będzie przedstawionych w kolejnych częściach.

Zadania

Aby przećwiczyć trochę informacje zawarte w tym wpisie można by zrobić kilka przykładowych zadań.

  1. Napisz program, który policzy silnie wykorzystując rekurencję.
  2. Napisz kalkulator z wyborem działania: dodawnaie, odejmowanie, mnożenie, dzielenie gdzie przy odpowiednim wyborze (select) zostanie wykonana odpowiednia funkcja wykonująca działanie na liczbach w kolejnych dwóch polach formularza.