← Lekcje
PHP · lekcja 23

Dzielimy kod
na pliki

Dzisiaj:

  1. include - dołączamy jeden plik PHP do drugiego; gdy pliku brakuje, strona dostaje ostrzeżenie i jedzie dalej
  2. require - to samo dołączanie, ale brakujący plik zatrzymuje całą stronę błędem
  3. include_once i require_once - pilnują, żeby ten sam plik nie wszedł do strony drugi raz
  4. Ćwiczenie: rozbijamy product-list.php na header.php i footer.php
Rozgrzewka · 3 minuty

Rozgrzewka: mysqli_error, mysqli_insert_id

  1. Co zwraca mysqli_error($db), gdy zapytanie się udało?
  2. Po co w ogóle wywołujemy mysqli_insert_id($db) po udanym INSERT?
  3. 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.

header.php nagłówek strony <h1>Sklep</h1> product-list.php treść: lista produktów SELECT z bazy shop localhost/nazwisko/product-list.php Sklep Kubek - 19.90 zł Długopis - 4.20 zł Kontakt: sklep@example.com jedna strona z trzech include footer.php stopka strony dane kontaktowe
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ę.

include "footer.php"; Warning: include(footer.php): Failed to open stream: No such file or directory on line 4 skrypt jedzie dalej reszta strony (za include) się wykonuje require "footer.php"; Warning: require(footer.php): Failed to open stream: No such file or directory on line 4 Fatal error: Uncaught Error skrypt zatrzymuje się w tym miejscu - reszta strony nie powstaje
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.

require (bez _once) - dwa dołączenia functions.php require "functions.php" require "functions.php" drugi raz - ten sam plik Fatal error: Cannot redeclare function formatPrice() require_once - dwa dołączenia functions.php require_once "functions.php" require_once "functions.php" rozpoznany, pominięty strona działa - functions.php wczytany tylko raz
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.

functions.php function formatPrice($p) jedna definicja funkcji connect-database.php mysqli_connect(...) jedno połączenie z bazą product-list.php require_once connect-database.php require_once functions.php SELECT * FROM products formatPrice($row["price"]) add-product.php require_once connect-database.php require_once functions.php INSERT INTO products formatPrice($price)

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 lekcjiW produkcjiStatus
Wspólny header.php/footer.php - include w każdym plikuSilnik szablonów (np. Blade) sam wstawia wspólny układ strony.zastępowane
functions.php dołączany require_onceAutoloader 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.nadal w użyciu
PHP Manual: function.include.php, function.require-once.php
Ćwiczenie przy komputerze · 15 minut

Ćwiczenie: header.php i footer.php

  1. Otwórz product-list.php z lekcji „Bazy danych 2/5” w folderze swojego serwera (np. htdocs).
  2. 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.
  3. W miejsce wyciętych fragmentów w product-list.php wstaw include "header.php"; i include "footer.php";.
  4. Sprawdź w przeglądarce: localhost/product-list.php ma wyglądać dokładnie tak samo jak przed podziałem.
  5. 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ę.
  6. Zostaw wszystkie trzy pliki obok siebie w folderze kursu - następne lekcje z nich korzystają.
Cały plik
// header.php  echo "<header><h1>Sklep</h1></header>";
// footer.php  echo "<footer>Kontakt: sklep@example.com</footer>";

// product-list.php
mysqli_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ę

  1. Czym różni się reakcja PHP na brakujący plik przy include a przy require?
  2. Dlaczego functions.php lepiej dołączyć przez require_once niż przez zwykłe require?
  3. Dlaczego do connect-database.php lepiej pasuje require niż include?

To zamyka temat dzielenia kodu na pliki. Na następnej lekcji: nowy temat.