PHP - 7. díl – include a spol.

V 7. dílu seriálu o PHP navážeme povídáním o vkládání jiných souborů do PHP skriptů pomocí include a dalších.

Příkaz include - první příklad

Příkaz include slouží k vložení souboru dovnitř PHP skriptu. Je to velmi užitečná věc sama o sobě, a znám lidi, kteří neumějí z PHP skriptů nic jiného, než příkaz include. A ten čile využívají a chválí si ho a jen kvůli němu jim stojí za to PHP využívat.

O co tedy jde? Představte si třeba, že chcete na konec každé své HTML stránky přidat stejnou věc. Řekněme třeba svojí adresu s kontakty. Nebo určitý obrázek, logo, apod.. Jedna z možností samozřejmě je poctivě svou adresu opsat na každou HTML stránku, kterou napíšete. PHP ovšem nabízí i jiné možnosti. Například i tu možnost, že adresu prostě napíšete do zvláštního souboru a pomocí příkazu include jí "vlepíte" do každé vaší stránky.

Zkusme si to tedy. Mějme soubor s adresou, který bude nazván adresa.html a bude to kus HTML kódu představující adresu:

<em>Kontakt:</em><br>
<strong>František Vocásek</strong><br>
Divadelní 18<br>
999 99 Lukavice<br>

A do každé stránky vložíme tento soubor pomocí příkladu include. Takže by to mohlo vypadat třeba takto:

<html>
<head>
<title>Příklad 1. z 7. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<p>Toto je obsah stránky.</p>
<?php
  include "adresa.html";
?>
</body>
</html>

Funkce je jasná. Jakmile PHP narazí na příkaz include, vloží obsah souboru, v našem případě tu adresu. Můžeme mít takto třeba stovku stránek se stejnou adresou na konci. Obrovská výhoda je, že pokud nastane změna v adrese, stačí opravit vložený soubor adresa.html a změna se promítne všude, kde jsme adresu vložili.

Stejně tak můžeme mít jiné prvky, které vkládáme do každé stránky. Například každá stránka může mít stejné menu. Tak je potom možné menu vložit pomocí příkazu include. Nebo stejný začátek stránky, atd.. Fantazii se meze nekladou.

Příkaz include - vložení PHP kódu

Příkaz include slouží k tomu, aby bylo možné rozdělit jednu stránku na více souborů. V takovém projektu se pak je možné lépe orientovat, případně každou část může vytvářet i jiná osoba. Jenomže příkaz include kromě vkládání textu považuje vložený soubor za plnohodný PHP skript. To tedy znamená, že PHP číhá, zda ve vloženém souboru nejsou také kusy PHP kódu, a pokud jsou, tak je provede.

Ten samý soubor lze vkládat i vícekrát, pokud to má smysl. Ve většině případů to smysl nemá. Přesto zde uvádím příklad, který vloží jeden soubor vícekrát.

Vložený soubor se bude jmenovat pocitej.php a bude prostě zobrazovat, kolikrát byl vložen:

<p><?php
  ++$počet;
  echo "Tento skript byl vložen celkem ", $počet, " krát.";
?></p>

Samotný hlavní skript bude vypadat takto:

<html>
<head>
<title>Příklad 2. z 7. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  $počet = 0;
  include "pocitej.php";
  include "pocitej.php";
  include "pocitej.php";
?>
</body>
</html>

Celý příklad funguje tak, že vkládaný soubor pocitej.php používá proměnnou s názvem $počet. Řádka ++$počet znamená, že se k hodnotě proměnné $počet přičte jednička. Následující příkaz echo pak vypíše kolikrát byl soubor vložen.

Na tomto příkladu jsem chtěl mimo jiné demonstrovat, že i proměnné mezi hlavním skriptem a vloženým souborem jsou společné.

V hlavním skriptu je nastavena hodnota proměnné $počet na nulu. Poté se třikrát vloží soubor pocitej.php, a ve výsledku každý z nich vypíše, kolikrát se do té doby vložil.

Co když soubor chybí?

Protože chybička se vždycky vloudí, může nás zajímat, co se stane, když soubor chybí? Můžeme si to zkusit na příkladu:

<html>
<head>
<title>Příklad 3. z 7. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  include "neexistujici_soubor";
  echo "<p>Nějaký text po použití příkazu include.</p>";
?>
</body>
</html>

V příkladu vkládám pomocí příkazu include soubor, který zaručeně neexistuje. A za tímto příkazem vypíšu pomocí příkazu echo nějaký text.

Pokud si příklad spustíte, zjistíte, že PHP vypíše anglické varování (Warning), ve kterém vám sděluje, že nemůže vložit soubor. Taková varování uvidíte na webu poměrně často, neboť i známým webům se stává, že nějaký soubor někde smažou při změnách, nebo zapomenou, a hlášení je na světě. Nicméně přesto všechno to PHP nepovažuje za tak závažnou chybu, aby se PHP skript zhroutil a předčasně skončil. PHP skript pokračuje tedy dál jakoby příkaz include ani neexistoval a následující text vypsaný příkazem echo se objeví.

Je třeba ale říci, že to právě hodně často nechceme. Hodně často se stává, že pokud se nevloží pomocí příkazu include důležitý soubor, ani nemá smysl, aby skript pokračoval. I to ovšem jde PHP říci, a to tak, že namísto příkazu include se použije příkaz require. Příkaz require dělá naprosto to samé, co include, tedy vkládá soubor. Jediný rozdíl je v tom, jak se zachová, když soubor chybí. Pokud soubor chybí, tak příkaz require předčasně skončí PHP skript a dál se nepokračuje. Zkusme stejný příklad, jako předchozí, ale s příkazem require:

<html>
<head>
<title>Příklad 4. z 7. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  require "neexistujici_soubor";
  echo "<p>Nějaký text po použití příkazu include.</p>";
?>
</body>
</html>

Pokud si spustíte tuto variantu příkladu, zjistíte, že se zachová odlišně. Anglické hlášení o tom, že nemůže vložit soubor vypíše také, ale rozdíl je, že už to není varování (anglicky Warning), ale "osudná chyba" (anglicky Fatal error). Kromě toho se skript ukončí, takže text u příkazu echo už se nikdy nevypíše.

Nutno říci, že příkazy require a include mohou zkrachovat nejenom z důvodu toho, že neexistují, ale také z jiných příčin. Velmi častou příčinou jsou špatná přístupová práva, tedy skript nemá práva na čtení souboru. To se dost často stává zejména na linuxových serverech. Kromě toho může být soubor poničený, ale to už spadá do kategorie hardwarových chyb.

Zamezení vícenásobného vložení souboru

V jednom předchozím příkladu jsem vložit jeden soubor třikrát. V mnohých případech tomu naopak chceme zamezit. Tedy chceme, aby v případě, kdy je tentýž soubor vkládám podruhé, potřetí, atd., aby se vložení ignorovalo. I na to se v PHP myslí a existují příkazy include_once a require_once, které slouží pro vkládání pouze jednou. Zkusme třeba použít náš předchozí příklad, kde došlo k trojnásobnému vložení, ale namísto include použijme include_once. Tedy soubor pocitej.php zůstane beze změny a příklad změníme takto:

<html>
<head>
<title>Příklad 5. z 7. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  $počet = 0;
  include_once "pocitej.php";
  include_once "pocitej.php";
  include_once "pocitej.php";
?>
</body>
</html>

Pokud si příklad zkusíte spustit, zjistíte, že k vložení dojde pouze poprvé. Podruhé a potřetí se ignoruje.

Příkaz return - předčasné vypadnutí z vloženého souboru

Ještě zde uvedu příkaz return. Anglické slovo return znamená v češtině návrat a to zcela vystihuje jeho funkci. Příkaz return v kontextu vloženého souboru slouží k tomu, aby v tomto místě se vkládání zastavilo a zbytek souboru se už nevložil. To je užitečné hlavně ve spojení s podmínkami. Například následující příklad použije vložený soubor k tomu, aby vypsal dopoledne větu "Těšíš na dnešní oběd?" Je to příklad trochu vyumělkovaný, ale demonstruje příkaz return dobře.

Vložený soubor se bude jmenovat obed.php:

<?php
  if (date("A") == "PM")
    return;
  echo "Těšíš na dnešní oběd?";
?>

Vlastní hlavní skript bude pak vypadat takto:

<html>
<head>
<title>Příklad 6. z 7. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  include "obed.php";
?>
</body>
</html>

Jak je vidět v příkladu, soubor pocitej.php nejdříve použije výraz date("A"), který vrátí "AM" pro dopoledne a "PM" pro odpoledne. Pokud je odpoledne, tedy výraz date("A") je roven "PM", pak konstrukce if vykoná příkaz return. A ten ukončí vkládání, takže následující příkaz echo už se nevloží. Pokud je dopoledne, vloží se i příkaz echo a věta se vypíše.

Diskuze (24) Další článek: Český Service Pack 3 pro Office XP

Témata článku: Software, PHP, Windows, Programování, Inc, Body, Head, Stejný soubor, Anglické slovo, Meta, Díl, Echo, Soubor, #include, HTML


Určitě si přečtěte



Aktuální číslo časopisu Computer

Speciál o přechodu na DVB-T2

Velký test herních myší

Super fotky i z levného mobilu

Jak snadno upravit PDF