Je ziet dit bericht omdat de EU dat een goed idee vindt. Deze website maakt gebruik van cookies van Google voor het tonen van advertenties en het bijhouden van bezoekersstatistieken. Google kan hiermee je surfgedrag volgen. Zie voor meer informatie het privacybeleid van Google. Via Your Online Choices kun tracking cookies van advertentiebedrijven blokkeren. Deze melding verbergen.

3 Includes

Eén van de meest gebruikte functies van PHP is de functie include(). Met behulp van deze functie kan een (PHP-)bestand in een ander PHP-bestand worden opgenomen. Deze functie is erg handig voor terugkerende elementen zoals een login-controle of het menu van de website.

Met behulp van include() kunnen de aloude HTML-frames gedag worden gezegd, en toch je menu in een apart bestand bewaren. Beter voor de vindbaarheid in de zoekmachines, beter voor de professionele uitstraling van de website. En in HTML5 bestaan frames zelfs niet meer!

Theorie

include() is officieel geen functie, maar voor het gemak doen we toch even alsof dat wel zo is.

mixed include ( string $path )

Als parameter vraagt include() om het pad naar het bestand dat in het huidige PHP-bestand opgenomen moet. Dit pad mag relatief zijn ten opzichte van het huidige bestand, of relatief ten opzichte van de wortelmap van de webserver. Net als bij afbeeldingen in HTML begint het pad met een slash (/) als relatief ten opzichte van de wortelmap van de webserver gekeken moet worden. Begint het pad niet met een slash, dan wordt relatief ten opzichte van het bestand dat wordt uitgevoerd gekeken. Gebruik ../ om een map naar boven te gaan.

In een PHP script zou een include() er als volgt uit kunnen zien:

include('map/naar/bestand.php');

Net als bij print() en echo() mag in geval van include() de haakjes weggelaten worden en kan er gekozen worden voor dubbele of enkele aanhalingstekens. Alle onderstaande voorbeelden zijn dus correct:

include 'bestand.php';
include
"/root/bestand.txt";
include(
'../map/bestand.inc.php');
include(
"map/bestand.php");

Wat in dit rijtje misschien opvalt is dat niet alleen de extensie .php, maar ook de extensie .txt gebruikt is. include() kan met alle soorten tekstbestanden omgaan. Niet alleen PHP-bestanden, maar ook tekstbestanden, HTML-bestanden, etc. Ongeacht de bestandsextensie wordt de inhoud van een geïnclude bestand uitgevoerd als PHP-code. Om PHP-code in een geïnclude bestand te gebruiken dient deze dan ook te worden aangekondigd met de bekende openingstag: <?php. Zonder deze openingstag wordt de inhoud van een geïnclude bestand beschouwd als doodnormale HTML-broncode.

Require

Een functie die heel veel op include() lijkt is require(). De werking van require() is exact gelijk aan die van include(), met slechts één verschil. Indien het opgegeven bestand niet kan worden gevonden, dan zal in geval van include() hierover een waarschuwing worden gegeven, maar wordt de rest van het PHP-script gewoon verwerkt. Indien in geval van require() het opgegeven bestand niet kan worden gevonden, dan wordt het uitvoeren van het PHP-script onmiddellijk gestaakt.

Afhankelijk van de situatie is één van de twee methoden dus het meest geschikt. include() voldoet over het algemeen prima, maar zodra iets van beveiliging om de hoek komt kijken is het verstandig om require() te gebruiken. Mocht het bestand dat controleert of iemand is ingelogd om wat voor reden dan ook even niet beschikbaar zijn, dan is raadzaam om uitvoering van de rest van het PHP-script onmiddellijk te stoppen, waardoor onrechtmatige toegang kan worden voorkomen.

Praktijkvoorbeeld: een alternatief voor HTML-frames

In dit voorbeeld gaan we de functie include() gebruiken om het sitemenu in een los bestand op te nemen. Bij wijzigingen in het menu hoeft dan nog maar één bestand aangepast te worden. Dit is vergelijkbaar met het voordeel dat HTML-frames bieden. In dit voorbeeld gaan we echter uit van een eenvoudige website zonder frames.

We gaan uit van een (denkbeeldige) website met de volgende structuur:

|- contact.html
|- fotos.html
|- index.html
|- nieuws.html

De opbouw van de pagina's is eenvoudig en is afgezien van concrete inhoud gelijk aan elkaar. Het menu-gedeelte van ieder van de vier genoemde HTML-bestanden is dus gelijk aan elkaar. Juist dit menu-gedeelte zal worden verplaatst naar een afzonderlijk bestand. De opbouw van de HTML-pagina's is als volgt:

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link href="style.css" type="text/css">
    <title>Pagina Titel</title>
</head>
<body>

    <div id="menu">
        <ul>
            <li><a href="index.html">Home</a></li>
            <li><a href="nieuws.html">Nieuws</a></li>
            <li><a href="fotos.html">Foto's</a></li>
            <li><a href="contact.html">Contact</a></li>
        </ul>
    </div>
    
    <div id="content">
        <!-- Inhoud van de pagina -->
    </div>

</body>
</html>

Het menu-gedeelte wordt uit alle HTML-bestanden verwijderd en in een nieuw bestand geplaatst: menu.inc.php. Er is hier bewust gekozen voor de extensie .inc.php, waarmee wordt aangegeven dat het betreffende bestand in een ander bestand geïnclude wordt. Hierdoor is meteen duidelijk dat het betreffende bestand als losstaand bestand geen nuttige functie heeft, maar alleen als het wordt opgenomen in een ander volwaardig PHP-script.

De inhoud van menu.inc.php is nu als volgt:

<div id="menu">
    <ul>
        <li><a href="index.html">Home</a></li>
        <li><a href="nieuws.html">Nieuws</a></li>
        <li><a href="fotos.html">Foto's</a></li>
        <li><a href="contact.html">Contact</a></li>
    </ul>
</div>

Hiermee wordt de bestandsstructuur van de website:

|- contact.html
|- fotos.html
|- index.html
|- menu.inc.php
|- nieuws.html

Via een include() wordt het menu nu weer terug ingevoegd in de menuloze HTML-bestanden. De inhoudt hiervan wordt nu als volgt:

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link href="style.css" type="text/css">
    <title>Pagina Titel</title>
</head>
<body>

    <?php include('menu.inc.php'); ?>
    
    <div id="content">
        <!-- Inhoud van de pagina -->
    </div>

</body>
</html>

Aangezien de PHP-code alleen wordt uitgevoerd als een bestand de .php extensie heeft, dient de html extensie van de websitebestanden nog veranderd te worden in php. De structuur van de website wordt hiermee als volgt:

|- contact.php
|- fotos.php
|- index.php
|- menu.inc.php
|- nieuws.php

Als we nu terugkijken naar de inhoud van menu.inc.php, dan zien we daar dat nog steeds wordt verwezen naar html-bestanden. Aangezien de html-bestanden nu php-bestanden zijn geworden, moet dit ook nog even aangepast worden:

<div id="menu">
    <ul>
        <li><a href="index.php">Home</a></li>
        <li><a href="nieuws.php">Nieuws</a></li>
        <li><a href="fotos.php">Foto's</a></li>
        <li><a href="contact.php">Contact</a></li>
    </ul>
</div>

Hiermee is het menu naar een afzonderlijk bestand verplaatst. Als er nu bijvoorbeeld een pagina aan de website wordt toegevoegd, hoeft het menu op nog maar één plek aangepast te worden in plaats van in alle html-bestanden.

Zelftest

  1. Indien PHP-code in een include()-bestand is opgenomen...
    1. …wordt deze altijd uitgevoerd.
    2. …dienen er haakjes gebruikt te worden bij include().
    3. …kan alleen echo() gebruikt worden en geen print().
    4. …dient deze altijd voorafgegaan zijn door <?php.
  2. Welke van onderstaande stellingen is/zijn waar?
    I              Uitvoering van het script wordt gestaakt indien een include()-bestand niet gevonden kan worden;
    II             Uitvoering van het script wordt gestaakt indien een require()-bestand niet gevonden kan worden.
    1. Beide stellingen zijn onwaar.
    2. Alleen stelling I is waar.
    3. Alleen stelling II is waar.
    4. Beide stellingen zijn waar.

Antwoorden zelftest

Antwoorden

  1. d
  2. c

Oefening: menu include

Gegeven is onderstaande HTML-code van het bestand contact.html:

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link href="style.css" type="text/css">
    <title>Contact</title>
</head>
<body>

    <div id="menu">
        <ul>
            <li><a href="index.html">Home</a></li>
            <li><a href="nieuws.html">Nieuws</a></li>
            <li><a href="producten.html">Producten</a></li>
            <li><a href="over.html">Over Ons</a></li>
            <li><a href="contact.html">Contact</a></li>
        </ul>
    </div>
    
    <div id="content">
        <h1>Contact</h1>
        <p>Gebruik onderstaand formulier om contact op te nemen.</p>
        <form action="form.php">
        Email: <input type="text" name="email"><br>
        Bericht: <textarea name="bericht" rows="8" cols="35"></textarea><br>
        <input type="submit" value="Verzenden"></form>
    </div>

</body>
</html>

Opdracht

Verwijder het menu uit de webpagina en plaats dit in een afzonderlijk PHP-bestand menu.inc.php. Gebruik vervolgens PHP om het menu in het overblijvende deel van de webpagina in te voegen.

Geef als antwoord de aangepaste versie van bovenstaande HTML-code en de inhoud van het afzonderlijke menu-bestand.

Neem aan dat het menu in de andere HTML-pagina's op vergelijkbare wijze wordt verwijderd en middels PHP ingevoegd.

Uitwerking opdracht

Uitwerking

contact.php

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link href="style.css" type="text/css">
    <title>Contact</title>
</head>
<body>

    <?php
    
include('menu.inc.php');
    
?>
    
    <div id="content">
        <h1>Contact</h1>
        <p>Gebruik onderstaand formulier om contact op te nemen.</p>
        <form action="form.php">
        Email: <input type="text" name="email"><br>
        Bericht: <textarea name="bericht" rows="8" cols="35"></textarea><br>
        <input type="submit" value="Verzenden"></form>
    </div>

</body>
</html>

menu.inc.php

    <div id="menu">
        <ul>
            <li><a href="index.html">Home</a></li>
            <li><a href="nieuws.html">Nieuws</a></li>
            <li><a href="producten.html">Producten</a></li>
            <li><a href="over.html">Over Ons</a></li>
            <li><a href="contact.html">Contact</a></li>
        </ul>
    </div>