In PHP gibt es eine ganze Reihe von Hilfsfunktionen mit denen man z.B. den Inhalt einer Variablen auf einen bestimmten Datentyp hin untersuchen kann, ob eine bestimmte Variable oder Konstante definiert ist, ob eine Datei existiert oder auch ob eine bestimmte Methode oder Funktion existiert.
Während all diese Funktionen vor allem für einen sicheren Programmablauf benötigt werden lassen sich mit den beiden letztgenannten Funktionen einige Programmabläufe durch ihre Dynmaik vereinfachen und selbst die Kompatibilität für verschiedene PHP-Versionen läßt sich damit beeinflußen.
Als erstes betrachten wir die Möglichkeit der variablen Funktionsaufrufe: So ist es in PHP möglich den Inhalt von Variablen als Funktions-/Methodenname zu benutzen und die Funktion über die Variable aufzurufen:
$input = 2;
// diese Funktionen sollen berechnet werden
$functions = array( 'cos', 'sin', 'tan', 'XYZ' );
foreach( $functions as $function ){
// per Hilfsfunktion überprüfen, ob es eine Funktion
// mit diesem Namen überhaupt gibt um Laufzeitfehler
// zu vermeiden
if( function_exists( $function ) ){
// Ausgabe des Funktionsnamens
print $function.'('.$input.') = ';
// Aufruf der Funktion anhand des Wertes von $function
print $function( $input );
print "\n";
}
}
Obiger Code erzeugt folgende Ausgabe:
cos(2) = -0.416146836547
sin(2) = 0.909297426826
tan(2) = -2.18503986326
Cos, sin und tan sind Standardfunktionen von PHP. XYZ gibt es nicht (wurde auch nicht im Beispiel als eigenständige Funktion erstellt) deshalb wird die Schleife dafür nicht ausgeführt.
Das ganze funktioniert für jede zum Zeitpunkt des Aufrufs bekannte Funktion (und auch bei Methoden von Klassen – $obj->$function() ) – inklusive selbst definierter. Anstelle die Funktionsnamen aus einem Array auszulesen kann man sie natürlich auch aus jeder anderen Quelle (z.B. Benutzereingabe) übernehmen. Die Möglichkeiten sind endlos – allerdings sollte man dann die Sicherheit nicht vergessen und z.B. Benutzereingaben nicht ungefiltert übernehmen.
Mit der Funktion „function_exists“ läßt sich auch die Kompatibilität zwischen verschiedenen PHP-Versionen gewährleisten. Zum einen kann man natürlich prüfen, ob es eine bestimmte neue Funktion gibt und diese dann ausführen oder alternativ eine andere alte benutzen.
Schöner ist es natürlich, wenn man die neue Funktion in der alten Version mit der selben Signatur selbst erstellt. Normalerweise gäbe es später einen Fehler, wenn das Skript auf der neuen PHP-Version eingesetzt wird, weil bei der Deklaration der eigenen Funktion eine Funktion mit dem selben Namen bereits existiert. Dieses läßt sich einfach umgehen indem man die Deklaration innerhalb eines if-Blocks macht und als Bedingung angibt, dass der Block nur ausgeführt werden soll, wenn es keine Funktion mit diesem Namen gibt.
if( !function_exists( 'scandir' ) ){
function scandir( $directory, $sorting_order, $context ){
// ...
}
}