Który komentarz poprawnie opisuje działanie tej funkcji PHP?function f($a, $b) {
if ($a == $b) return -1;
return ($a > $b) ? $a : $b;
}
Źle. Przy równości zwraca -1, nie $a.
Dobrze. Dokładnie tak działa ta funkcja.
Źle. Funkcja zwraca WIĘKSZĄ, nie mniejszą.
Źle. Ani „mniejszą”, ani „$a”.
Ten komentarz dobrze opisuje funkcję, bo kod najpierw sprawdza warunek $a == $b. Jeśli obie wartości są uznane przez PHP za równe, funkcja od razu kończy działanie instrukcją return -1. To jest ważne: dalsza część funkcji już się wtedy nie wykona. Gdy wartości nie są równe, wykonywany jest operator warunkowy, czyli tak zwany operator trójargumentowy: ($a > $b) ? $a : $b. Oznacza to: jeżeli $a jest większe od $b, zwróć $a, w przeciwnym razie zwróć $b. W praktyce funkcja działa więc podobnie do wyznaczania maksimum z dwóch liczb, ale z osobnym przypadkiem dla równości. Przykładowo f(7, 3) zwróci 7, f(2, 9) zwróci 9, a f(5, 5) zwróci -1. Moim zdaniem warto tu zauważyć jedną rzecz z dobrych praktyk PHP: użyto operatora ==, czyli porównania luźnego. W realnym kodzie często lepiej stosować ===, jeśli zależy nam na porównaniu także typu danych, np. liczby 5 i tekstu '5'. Dzięki temu unikamy dziwnych przypadków, które w aplikacjach webowych potrafią potem robić mały bałagan.
W tym zadaniu łatwo pomylić się przez szybkie spojrzenie na operator trójargumentowy i nie doczytanie warunku znajdującego się wcześniej. Funkcja nie zwraca mniejszej wartości, ponieważ wyrażenie ($a > $b) ? $a : $b wybiera $a wtedy, gdy $a jest większe od $b. Jeśli ten warunek nie jest spełniony, a wcześniej wykluczono równość, to większe musi być $b. Czyli cały ten fragment służy do zwrócenia większej wartości, a nie mniejszej. To taki klasyczny skrót zapisu instrukcji if...else, często spotykany w PHP, JavaScript i innych językach. Druga pułapka dotyczy przypadku, gdy wartości są równe. W kodzie jest wyraźnie napisane: if ($a == $b) return -1;. Instrukcja return natychmiast kończy działanie funkcji, więc przy równości nie ma już przejścia do operatora trójargumentowego. Dlatego opis mówiący, że funkcja zwróci wtedy $a, jest niezgodny z przepływem sterowania. Z mojego doświadczenia uczniowie czasem zakładają, że skoro przy równości $a i $b mają tę samą wartość, to można zwrócić dowolną z nich. Tu jednak programista specjalnie wstawił wartość -1 jako sygnał specjalny, być może oznaczający brak większej wartości albo remis. Warto też pamiętać, że w PHP operator == wykonuje porównanie luźne, więc w profesjonalnym kodzie trzeba uważać na typy danych. Dla czytelności i bezpieczeństwa często lepsze bywa ===, ale w kontekście tego pytania najważniejsze jest rozumienie kolejności instrukcji i działania return.