Verschachtelte Funktionen

PHP bietet nicht nur die Möglichkeit Funktionen direkt auf Ebene des Hauptprogramms zu definieren. Innerhalb einer Funktion oder Klasse kann der Entwickler munter weitere Funktionen oder auch Klassen definieren. Dabei gilt des folgendes zu Bedenken: Werden auf diesem Wege – innerhalb einer Klasse oder Funktion – Funktionen oder Klassen definiert, so sind diese erst aufrufbar bzw. nutzbar, wenn die Funktion, in der sie definiert werden, bereits mindestens einmal aufgerufen wurde. Was allerdings nicht möglich ist: Einmal definiert kann eine Funktion weder unter gleichem Namen neu definiert noch nachträglich wieder gelöscht werden.

<?php
    // Funktion zur Demonstration von verschachtelten Funktionen
    function parent () {
        // Definition der Funktion child innerhalb von parent
        // Sie wird noch nicht aufgerufen! Es erfolgt lediglich
        // die Definition! Nachdem die Funktion aufgerufen wurde
        // ist die Funktion child von allen Stellen des Scripts
        // aus aufrufbar.
        function child () {
            echo 'Child Aufgerufen!<br>';
        }

        // Und nun die eigentliche Arbeit von Parent machen...
        echo 'Parent aufgerufen!<br>';
    }

    // Gibt es child schon?
    // Hierdurch vermeiden wir, dass eine Funktion aufgerufen wird,
    // die es noch nicht gibt. Wer sich den unvermeidlichen Fehler
    // einfagen möchte, entfernt diesen Block einfach und ersetzt ihn
    // durch einen unbedingten Aufruf von child..
    if (function_exists ('child'))
        // Dann rufen wir die Funktion direkt mal auf
        child ();
    else
        // Ansonsten geben wir das Fehlen zu Protokoll
        echo 'Child existiert noch nicht!<br>';

    // Jetzt wird parent aufgerufen...
    parent ();
    // und nun ist auch child bekannt und kann aufgerufen werden.
    child ();
?>

Child existiert noch nicht!
Parent aufgerufen!
Child Aufgerufen!

Conditional Functions

Unter Conditional Functions versteht man Funktionen, die nur unter bestimmten Umständen definiert werden. In der Praxis bedeutet dies, dass der Code-Block mit der Funktionsdefinition innerhalb eines If-Statements steht. Die Funktion wird also nur dann definiert, wenn bestimmte (in der If-Anweisung formulierten) Rahmenbedingungen gegeben sind. Ebenso, wie bei verschachtelten Funktionen gilt für Conditional Functions: Kein Aufruf, bevor der Code mit der Funktionsdefinition ausgeführt wurde. Da man sich nicht darauf verlassen kann, dass eine Conditional Function definiert wurde, sollte deren Aufruf nur mit vorangehender Existenzabfrage erfolgen. Conditional Functions werden oft verwendet, wenn ein Script Funktionen benötigt, die aus Bibliotheken stammen, bei denen man sich nicht darauf verlassen kann, ob sie auf dem Webserver installiert sind. Fehlt die Funktion, so wird eine eigene implementiert, die dann einspringt – hierdurch erspart man sich gerne mal die Installation einer Bibliothek und die damit verbundene Anpassung einer PHP-Standardkonfiguration. Ist die Funktion bereits definiert – die nötige Bibliothek also installiert –, so greift das Script auf diese zurück. Nachfolgend der Code einer je nach Konfigurationseinstellung eingebundenen oder nicht eingebundenen Bibliotheksdatei, worauf ein Script folgt, welches ggf. die fehlende Funktionen implementiert. Die Ausgabe des Scripts gibt dann Aufschluss darüber, welche Version der Funktion tatsächlich verwendet wird.

<?php
    // Auszug aus einer genutzten Bibliothek, die Standardmäßig eingebunden
    // wird - oder eben nicht...
    // Je nach Konfiguration des Webservers (bzw. von PHP) wird der Code
    // aus dieser Datei eingebunden.
    :
    :
    function f_aus_bibliothek () {
        return 'Ich stamme aus der Bibliothek!';
    }
    :
    :
?>
<?php
    // Inhalt des Scripts, welches die von f_aus_bibliothek zur Verfügung
    // gestellte Funktionalität nutzen möchte

    // Wurde die Funktion bislang noch nicht definiert?
    if (!function_exists ('f_aus_bibliothek')) {
        // Dann sollte das jetzt geschehen
        function f_aus_bibliothek () {
            return 'Ich stamme nicht aus der Bibliothek, erfülle aber den selben Zweck!';
        }
        // Erst ab diesem Punkt kann die Funktion aufgerufen werde
        // (welche Implementation dabei auch immer ausgeführt wird)
    }

    // Immer vorher nachschauen, ob die Funktion bereits definiert wurde
    if (function_exists ('f_aus_bibliothek'))
        // Aufruf der Funktion
        $werwars = f_aus_bibliothek ();
    // Und das Ergebnis ausgeben
    echo $werwars . '<br>';
?>

¬ Tutorials



¬ Insolvenzrecht