include - dołączamy jeden plik PHP do drugiego; gdy pliku brakuje, strona dostaje ostrzeżenie i jedzie dalej
require - to samo dołączanie, ale brakujący plik zatrzymuje całą stronę błędem
include_once i require_once - pilnują, żeby ten sam plik nie wszedł do strony drugi raz
Ćwiczenie: rozbijamy product-list.php na header.php i footer.php
Rozgrzewka · 3 minuty
Rozgrzewka: mysqli_error, mysqli_insert_id
Co zwraca mysqli_error($db), gdy zapytanie się udało?
Po co w ogóle wywołujemy mysqli_insert_id($db) po udanym INSERT?
Co musimy zrobić z wynikiem mysqli_query(), zanim sprawdzimy if (!$result)?
Część 1 · Jedna strona z trzech plików
include: dołączamy plik do pliku
Od lekcji „Bazy danych 1/5” każdy nasz plik PHP miał wszystko w jednym miejscu - łącznie z tymi samymi czterema liniami połączenia z bazą, wklejonymi osobno do product-list.php i do add-product.php. Polecenie include "name.php" wkleja treść wskazanego pliku dokładnie w tym miejscu, w którym stoi - tak, jakby ten kod był tam napisany od razu. Dzięki temu piszemy jeden plik i używamy go w wielu miejscach.
PHP Manual: function.include.php („The include expression includes and evaluates the specified file.”, php.net/manual/en/function.include.php)
Część 2 · include kontra require
Brakujący plik: ostrzeżenie czy błąd?
Co się stanie, gdy plik do dołączenia zniknie (na przykład ktoś go skasował albo pomylił nazwę)? include i require reagują różnie. require działa tak samo jak include, tylko przy braku pliku zamiast ostrzeżenia rzuca błędem, który zatrzymuje całą stronę.
PHP Manual: function.include.php, function.require.php („require is identical to include except upon failure it will also produce a fatal Error exception”)
Część 3 · Bez duplikatów
require_once: ten sam plik tylko raz
Gdy dwa różne pliki (na przykład header.php i product-list.php) oba dołączają functions.php, zwykłe require wciągnie ten sam kod dwa razy - a PHP nie pozwala zdefiniować tej samej funkcji dwa razy. require_once pamięta, które pliki już dołączył, i drugi raz po prostu je pomija.
PHP Manual: function.require-once.php („PHP will check if the file has already been included, and if so, not include (require) it again”), function.include-once.php
Część 4 · Zewnętrzne deklaracje funkcji
Jedna definicja, wiele stron
Funkcje własne z lekcji „Funkcje w PHP” (na przykład formatPrice()) możemy trzymać w osobnym pliku functions.php - bez żadnego kodu, który sam się od razu wykonuje, same deklaracje function. Każda strona, która potrzebuje tej funkcji, dołącza ten plik przez require_once: require, bo bez tych funkcji strona i tak nie zadziała poprawnie; _once, żeby nie było próby zdefiniowania tej samej funkcji drugi raz.
Ciekawostka z PHP Manual: kod z dołączonego pliku dziedziczy zmienne, które są ustawione w miejscu, gdzie stoi require albo include. Dlatego zmienna $db, ustawiona w connect-database.php, działa dalej w product-list.php i w add-product.php bez żadnego dodatkowego przekazywania.
PHP Manual: function.require-once.php · ciekawostka: PHP Manual, „the code it contains inherits the variable scope of the line on which the include occurs” · php.net/manual/en/function.include.php
Poza szkołą
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
Wspólny header.php/footer.php - include w każdym pliku
Silnik szablonów (np. Blade) sam wstawia wspólny układ strony.
zastępowane
functions.php dołączany require_once
Autoloader Composera (PSR-4) sam dołącza potrzebny plik - require w tle.
narzędzia
Nazwa pliku wprost: include "header.php"
include __DIR__ . "/header.php" - działa z każdego miejsca uruchomienia.
Otwórz product-list.php z lekcji „Bazy danych 2/5” w folderze swojego serwera (np. htdocs).
Wytnij górną część strony (nagłówek <h1>Sklep</h1>) do nowego pliku header.php, a dolną część (dane kontaktowe) do nowego pliku footer.php.
W miejsce wyciętych fragmentów w product-list.php wstaw include "header.php"; i include "footer.php";.
Sprawdź w przeglądarce: localhost/product-list.php ma wyglądać dokładnie tak samo jak przed podziałem.
Na próbę zmień w kodzie include na require i popraw nazwę footer.php na nieistniejącą - zobacz różnicę w komunikacie, potem napraw kod z powrotem na include i poprawną nazwę.
Zostaw wszystkie trzy pliki obok siebie w folderze kursu - następne lekcje z nich korzystają.
Cały plik
// header.phpecho"<header><h1>Sklep</h1></header>";
// footer.phpecho"<footer>Kontakt: sklep@example.com</footer>";
// product-list.phpmysqli_report(MYSQLI_REPORT_OFF); $db = mysqli_connect("localhost", "root", "", "shop");
if (!$db) { die("Błąd połączenia z bazą danych."); }
include"header.php";
$result = mysqli_query($db, "SELECT * FROM products");
while ($row = mysqli_fetch_assoc($result)) {
echo$row["name"] . " - " . $row["price"] . " zł<br>";
}
include"footer.php";
Na koniec
Sprawdź się
Czym różni się reakcja PHP na brakujący plik przy include a przy require?
Dlaczego functions.php lepiej dołączyć przez require_once niż przez zwykłe require?
Dlaczego do connect-database.php lepiej pasuje require niż include?
To zamyka temat dzielenia kodu na pliki. Na następnej lekcji: nowy temat.