Skip to content

Blok 2

Podsumowanie diagnostyki z bloku 1 na 22 pracach: sekcjonowanie semantyczne (header/main/footer) miało 10 prac, mailto: 2, blockquote 3, tabela albo lista definicyjna na pary klucz–wartość 0, opisowy alt 1. Najczęstszy problem to kolejność nagłówków. CSS był w obu grupach mocniejszy niż HTML.

Trzy rzeczy do zapamiętania po diagnostyce. Nagłówki tworzą konspekt dokumentu i idą po kolei (h1, potem h2, potem h3), nie według rozmiaru liter. Znacznik opisuje, czym coś jest: cytat to blockquote, adres mailowy to link z mailto:, pary klucz–wartość to lista definicyjna dl albo tabela. Tabela ma anatomię: caption (tytuł), thead (nagłówek), tbody (dane), tfoot (podsumowanie), a komórka nagłówka kolumny to th scope="col". Pełna ściąga tagów jest w sekcji Materiały.

Na otwarciu bloku krótki quiz z materiału z poprzedniego tygodnia: kod na slajdzie, każdy pisze u siebie odpowiedź, potem odsłona.

Pytanie 1: echo imie; bez znaku dolara. PHP szuka stałej o nazwie imie, a takiej nie ma, więc zamiast napisu leci błąd. Zmienna zawsze ma $.

Odpowiedź: c. Bez $ PHP traktuje imie jako stałą, nie zmienną, i zgłasza błąd.

Pytanie 2: if ($ocena = 5) z jednym znakiem równości. To nie porównanie, tylko przypisanie: $ocena dostaje 5, a warunek jest zawsze prawdziwy. Porównanie to ==.

Odpowiedź: b. Przypisanie w warunku zwraca przypisaną wartość, a 5 jest prawdą, więc gałąź wykonuje się zawsze.

Pytanie 3: brak średnika po $a = 5. PHP zgłasza błąd składni w linii 2, choć błąd jest w linii 1 — numer linii w komunikacie to miejsce, w którym PHP zauważył problem, nie zawsze miejsce, gdzie on jest.

Odpowiedź: b.

Pytanie 4: napis w pojedynczych cudzysłowach jest brany dosłownie, zmienne nie są podstawiane. Wypisze Cześć $imie. Podstawianie działa tylko w podwójnych cudzysłowach.

Odpowiedź: b.

Pytanie 5: + zamiast .. W PHP plus zawsze liczy, a napis „Wynik: “ nie jest liczbą, więc leci błąd typu. Sklejanie napisów to kropka: "Wynik: " . $wynik.

Odpowiedź: c.

Pytanie 6: pętla od 0 do 10 włącznie wykona się 11 razy. Żeby wykonać dokładnie 10, start od 1 albo warunek < 10.

Odpowiedź: c.

Pytanie 7: w foreach ($tablica as $klucz => $wartosc) lewa strona strzałki to klucz, prawa to wartość, niezależnie od nazw. Tu $indeks dostaje wartości, więc wypisze 534. Nazwy zmiennych są dla czytającego, nie dla PHP.

Odpowiedź: b.

Pytanie 8: drabinka if/elseif sprawdza warunki po kolei i wchodzi do pierwszego spełnionego. Średnia 5.0 spełnia już >= 3.0, więc gałąź wyróżnienie jest martwa. Warunki w drabince idą od najostrzejszego do najłagodniejszego.

Odpowiedź: b.

Pytanie 9: literówka w nazwie zmiennej ($sum zamiast $suma). PHP nie zatrzymuje się, tylko wypisuje pusty napis i ostrzeżenie o niezdefiniowanej zmiennej. Ostrzeżenia się czyta, nie ignoruje.

Odpowiedź: b.

Pytanie 10: dzielenie przez count([]), czyli przez zero. W PHP 8 to błąd DivisionByZeroError, który zatrzymuje cały skrypt — nie ostrzeżenie. Przed dzieleniem przez liczbę elementów sprawdza się, czy tablica nie jest pusta.

Odpowiedź: d.

Zadanie bloku 2: wyniki zawodów biegowych. Starter (pobierz bieg-starter.zip) ma gotową tablicę zawodników z czasami okrążeń w sekundach i szkielet tabeli HTML; do napisania jest pętla wypełniająca wiersze (czasy w formacie m:ss, najlepsze okrążenie, średnie, kategoria, uwagi, klasa CSS od kategorii) i podsumowanie w tfoot. Plik nazywa się nazwisko_imie_blok2.php (małe litery, bez polskich znaków); nazwa jest częścią zadania, plik pod inną nazwą dostaje najwyżej 1. Jeden z zawodników nie ma ani jednego ukończonego okrążenia — trzeba to obsłużyć, inaczej skrypt pada. Pełna treść w sekcji Zadania.

Godzina samodzielnej pracy nad zadaniem. Pytania o to, dlaczego coś zostało zrobione tak, a nie inaczej, padają w trakcie pracy — to jest obrona z Zasad.

Ta sama linijka formatująca czas pojawia się w rozwiązaniu cztery razy: przy liście okrążeń, przy najlepszym, przy średnim i przy najlepszym okrążeniu zawodów. Zmiana formatu oznacza poprawianie w czterech miejscach i przeoczenie jednego. To problem, który rozwiązują funkcje.

Funkcja to nazwany kawałek kodu z parametrami i wynikiem. function nazwa($parametr) { ... return wynik; } definiuje ją, nazwa(wartość) wywołuje. return oddaje wynik i kończy działanie funkcji. Funkcje wbudowane (min, count, implode, floor, str_pad) działają dokładnie tak samo, tylko napisał je ktoś inny. Wewnątrz funkcji widoczne są tylko jej parametry i zmienne w niej utworzone, nie zmienne z zewnątrz.

return może wystąpić kilka razy: pierwszy napotkany kończy funkcję. null to sposób na powiedzenie „nie ma wyniku”, np. gdy tablica jest pusta; miejsce wywołania sprawdza to przez === null.

Refactor to zmiana kodu bez zmiany wyniku. Kolejność: najpierw to, co jest skopiowane najwięcej razy (formatowanie czasu), potem logika z haczykiem (najlepsze okrążenie, średnie), potem drabinka kategorii. Po każdym kroku strona wygląda identycznie.

Druga sesja robocza: kopia pliku jako nazwisko_imie_funkcje_blok2.php i przepisanie własnego rozwiązania na funkcje w tej kopii, plik z pierwszej sesji zostaje bez zmian. Minimum to formatujCzas i jedna własna funkcja więcej. Rozszerzenia: funkcja zwracająca tablicę (uwagi) i parametr z wartością domyślną.

Oddanie: dwa pliki, nazwisko_imie_blok2.php (wersja z pierwszej sesji, punktowana 0/1/2; plik pod inną nazwą dostaje najwyżej 1) i nazwisko_imie_funkcje_blok2.php (wersja po refactorze, przeglądana, bez punktów). Grupa 1 wypycha oba do swojego repozytorium, grupa 2 wysyła na Teams. Na otwarciu następnego bloku quiz obejmie funkcje.

Koniec bloku.