Hall allemaal, een beginnersvraag. In het verleden heb ik geprogrammeerd waarbij ik delen van de software als library kon includen. Bij php werkt het anders. Ik dacht slim te zijn door een vast blok source code via een indlude in andere php pagina’s te gebruiken, als ware het een code. Dat werkte/werkt niet. Welke oplossing is daarvoor beschikbaar. Het kan gaan van variabelen vullen/de larderen die in de source dan gebruikt worden. Of een standaard footer. Kopiëren is gemakkelijk, maar ik vind het modulair programmeren handiger. Op een plek de source aanpassen die vervolgens in de pagina’s verwerkt worden. Hoe doen jullie dit en wat is aan te bevelen in php? Alvast dank.
Kijk... hier leer ik weer iets bij. Dank! Ik dacht ook aan een standaardmenu die op meerdere pagina’s komt. Een keer maken en vaker gebruiken is mijn streven.
Ik denk dat de topicstarter naar twee verschillende dingen op zoek is:
- configuratie-variabelen
- een manier om herhalende/standaard delen in een pagina-ontwerp in te voegen

Deze hebben elk een iets ander gedrag dus deze zou ik niet op eenzelfde hoop gooien.

Configuratie-variabelen zitten vaak in een apart bestand. Je kunt dit op een heleboel manieren structureren, bijvoorbeeld met constanten zoals @Bart hierboven aangeeft. Maar ook alles opslaan in een configuratie-object of één groot array zijn opties. Je (Jan) geeft aan dat dat niet (of niet altijd?) werkt. Dit kan te maken hebben met het geldigheidsgebied, ofwel de scope van variabelen. Mogelijk ben je bijvoorbeeld het volgende gewend vanuit JavaScript:
var hello = 'Hello World.';

function test() {
    alert(hello);
}

test();

De variabele "hello" is bekend in alle "ondergelegen codeniveau's", zo ook de functie die na de declaratie van "hello" staat gedefinieerd.

PHP hanteert een wat strictere scheiding, de volgende code:
<?php
$hello = 'Hello World.';

function test() {
    echo $hello;
}

test();
?>

Levert een foutmelding op:
Notice: Undefined variable: hello in <het script> on line <regelnummer>

Dit komt omdat de functie test (echt) een aparte (en gescheiden) variabelen-ruimte (scope) heeft ten opzichte van alles wat buiten die functie plaatsvindt. Als je wilt dat de functie test() de variabele $hello kent zul je deze op een of andere manier bekend moeten maken. Dit zou je bijvoorbeeld kunnen doen door deze aan de functie door te geven als parameter:
<?php
$hello = 'Hello World.';

function test($message) {
    echo $message;
}

test($hello);
?>

Of, maar niet aan te raden, $hello uit de globale(re) scope te trekken:
<?php
$hello = 'Hello World.';

function test() {
    global $hello;
    echo $hello;
}

test();
?>

Of je zou $test als constante kunnen definiëren. Constanten worden niet beperkt door scope en zijn overal toegankelijk:
<?php
define('HELLO', 'Hello World.');

function test() {
    echo HELLO;
}

test();
?>

Traditioneel worden constanten altijd volledig in HOOFDLETTERS opgesteld. De vraag is of je zo je variabelen wilt definiëren - dit hangt een beetje van het gebruik af, zijn dit echt alle variabelen die configuratie regelen en waarvan je wilt dat deze ook overal opvraagbaar (en ook bruikbaar!) zijn of verzorgen deze ook andere taken of hebben deze een wat beperkter doel dan universele bekendheid?

Ook zou je gewoon een platte lijst kunnen bijhouden in een array, dit zou ik verkiezen boven "losse" variabelen omdat de kans dan wat kleiner is dat je deze per ongeluk overschrijft omdat deze alle opgehangen zijn aan één kapstok (de naam van het array). Dit array zou je vervolgens in een apart bestand onder kunnen brengen, bijvoorbeeld config.php:
<?php
$myConfig = array(
    'hello' => 'Hello World.',
);
?>


Binnen de scope (functie) waarin je deze config nodig hebt include je deze met "require" (hiermee stel je het aanwezig zijn van je configuratie-bestand verplicht, dit in tegenstelling tot een normale "include"):
<?php
function test() {
    require './config.php';
    echo $myConfig['hello'];
}

test();
?>

Goed, mogelijkheden te over.

Dan zijn daar nog standaard HTML snippets, in zijn eenvoudigste vorm zou je dit kunnen doen via require_once. Bijvoorbeeld voor een pagina-header en -footer.

Vaak wil je wel specifieke dingen variabel kunnen houden in deze onderdelen. Zo zou je in een header een pagina-titel in will stellen, en eventueel JavaScript- of CSS-bestanden in willen voegen. In een footer zou je misschien nog iets anders kwijt willen. Er is dan ook iets voor te zeggen om hier ook functies van te maken die je parameters kunt voeren.

Header:
<?php
function __header($pageTitle) {
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><?php echo $pageTitle ?></title>
</head>

<body><?php
}
?>


Footer:
<?php
function __footer() {
?></body>
</html><?php
}
?>


Pagina:
<?php
// print header
__header('This is the page title');
    ?><h1>My page header</h1>
    <p>Hello World.</p><?php
// print footer
__footer();
?>

Op een soortgelijke wijze als vorige voorbeelden zou je de functies in aparte bestanden kunnen zetten en ook kunnen includen in de pagina zelf. Dit zou je dan via require_once kunnen doen omdat je een header en een footer doorgaans maar één keer nodig hebt in een pagina-opbouw.

Merk op dat het "Pagina" script een volledig -en kloppend- HTML-document produceert.
Hallo Thomas,
Dank voor jouw uitvoerige tutorial. Dank, ik begin het php include te snappen. Dank!

Reageren