Która z wymienionych funkcji zapisanych językiem PHP zwraca połowę sumy a i b?
A.
function licz($a, $b) { return ($a + $b)/2; }
B.
function licz($a, $b) { return 2/($a + $b); }
C.
function licz($a, $b) { return $a/2 + $b; }
D.
function licz($a, $b) { return $a + $b/2; }
Wybrana funkcja jest poprawna, bo najpierw oblicza sumę argumentów $a i $b, a dopiero potem dzieli wynik przez 2. Kluczowe są tutaj nawiasy w wyrażeniu ($a + $b) / 2. W PHP, tak samo jak w matematyce, nawiasy mają najwyższy priorytet, więc interpreter najpierw wykona dodawanie, a potem operator dzielenia. Czyli dla $a = 10 i $b = 6 funkcja zwróci 8, bo 10 + 6 = 16, a 16 / 2 = 8. To jest dokładnie średnia arytmetyczna dwóch liczb. Z praktycznego punktu widzenia taka funkcja może się przydać np. przy liczeniu średniej ocen, średniej ceny, punktu środkowego między dwiema wartościami albo prostych statystyk w aplikacji webowej. W PHP warto też pamiętać, że operator / zwykle zwraca wynik typu float, nawet jeśli liczby wejściowe są całkowite. W dobrym kodzie produkcyjnym dobrze byłoby dopisać typy, np. function licz(float $a, float $b): float, bo wtedy funkcja jest czytelniejsza i trudniej przypadkiem przekazać do niej tekst zamiast liczby. Moim zdaniem nawiasy w takich wzorach warto pisać nawet wtedy, gdy wydają się oczywiste, bo kod czyta potem człowiek, nie tylko interpreter.
W niepoprawnych wariantach problem wynika głównie z niezrozumienia kolejności wykonywania operatorów albo z pomylenia pojęcia połowy sumy z sumą połówek tylko jednego składnika. W PHP operator dzielenia ma wyższy priorytet niż dodawanie, więc zapis $a + $b / 2 nie oznacza tego samego co ($a + $b) / 2. Interpreter najpierw podzieli $b przez 2, a dopiero potem doda $a. Dla wartości 10 i 6 da to 13, a nie 8. Podobny błąd jest w wyrażeniu $a / 2 + $b, tylko tam dzielona jest przez 2 zmienna $a, a nie cała suma. To częsta pułapka, bo na oko zapis wygląda prawie jak wzór na średnią, ale matematycznie robi coś innego. Jeszcze inną koncepcją jest 2 / ($a + $b). Taki zapis oblicza iloraz liczby 2 przez sumę argumentów, czyli coś odwrotnego do oczekiwanego działania. Przy $a + $b równym 0 może nawet pojawić się problem dzielenia przez zero, więc w realnym kodzie byłoby to dodatkowo ryzykowne. Dobra praktyka jest prosta: jeśli chcesz wykonać działanie na całej sumie, obejmij sumę nawiasami. W testach jednostkowych od razu wyszłoby, że tylko zapis ($a + $b) / 2 zwraca poprawną średnią dla różnych danych wejściowych. Z mojego doświadczenia takie drobne nawiasy bardzo często decydują, czy funkcja liczy poprawnie, czy tylko wygląda poprawnie.