Skip to main content

Was macht extract()?

Die Funktion extract() macht genau das, was ihr Name andeutet: Sie extrahiert die Elemente eines assoziativen Arrays und erstellt für jedes Element eine lokale Variable. Der Schlüssel des Array-Elements wird zum Variablennamen und der Wert des Elements wird zum Inhalt der Variable.

Ein einfaches Beispiel:

Stell dir vor, du hast folgendes Array:

PHP

$data = [
    'titel' => 'Meine coole Webseite',
    'benutzer' => 'Anna'
];

Wenn du jetzt extract($data); aufrufst, passiert folgendes:

PHP

extract($data);

// PHP hat jetzt ZWEI neue Variablen erstellt:
echo $titel;    // Gibt aus: 'Meine coole Webseite'
echo $benutzer; // Gibt aus: 'Anna'

Die Funktion hat also $data['titel'] in die Variable $titel und $data['benutzer'] in die Variable $benutzer umgewandelt.


 

In welchem Zusammenhang nutzt man das?

 

Der häufigste Anwendungsfall ist die Übergabe von Daten von einem Controller an einen View. Das macht den Code im View (in der HTML-Datei) viel sauberer und lesbarer.

Schauen wir uns deine loadView-Funktion in helpers.php an. Man könnte sie so erweitern, dass sie Daten entgegennimmt:

1. Deine aktuelle loadView-Funktion:

PHP

// in helpers.php
function loadView($name)
{
    $viewPath = basePath("views/{$name}.view.php");

    if (file_exists($viewPath)) {
        require $viewPath;
    } else {
        echo "View '{$name} not found!'"; // Kleiner Tippfehler von mir korrigiert
    }
}

2. Erweiterte loadView-Funktion mit Datenübergabe:

PHP

// in helpers.php
/**
 * Load a view
 * @param string $name
 * @param array $data
 * @return void
 */
function loadView($name, $data = [])
{
    $viewPath = basePath("views/{$name}.view.php");

    if (file_exists($viewPath)) {
        extract($data); // HIER PASSIERT DIE MAGIE!
        require $viewPath;
    } else {
        echo "View '{$name} not found!'";
    }
}

3. Wie der Controller sie jetzt nutzt:

PHP

// in einem Controller, z.B. home.php
$jobs = [
    ['titel' => 'PHP Entwickler', 'stadt' => 'Hamburg'],
    ['titel' => 'Designer', 'stadt' => 'Berlin']
];

loadView('home', [
    'pageTitle' => 'Startseite',
    'jobs' => $jobs
]);

4. Was im View (home.view.php) passiert:

Dank extract($data) kannst du im View jetzt direkt auf die Variablen zugreifen, anstatt auf das $data-Array.

Ohne extract (unübersichtlich):

HTML

<h1><?= $data['pageTitle'] ?></h1>
<?php foreach($data['jobs'] as $job): ?>
    <p><?= $job['titel'] ?></p>
<?php endforeach; ?>

Mit extract (sauber und lesbar):

HTML

<h1><?= $pageTitle ?></h1>
<?php foreach($jobs as $job): ?>
    <p><?= $job['titel'] ?></p>
<?php endforeach; ?>

Du siehst, der Code im View ist viel einfacher zu lesen und zu schreiben. extract() dient also als Brücke, um die Daten aus dem „Logik-Teil“ (Controller) bequem im „Präsentations-Teil“ (View) verfügbar zu machen.

Wichtiger Hinweis: Man sollte extract() mit Vorsicht verwenden, besonders bei Daten, die von Nutzern kommen (wie $_POST), da es bestehende Variablen überschreiben und zu Sicherheitslücken führen kann. Im Kontext der Datenübergabe vom Controller an den View ist es aber ein gängiges und praktisches Muster.

Leave a Reply