Start · Sprachen · PHP · Referenz · create_function

create_function

Funktion

Erzeugt eine anonyme PHP-Funktion dynamisch aus Strings und gibt ihren generierten Namen zurück.

seit PHP 4.0.1 Kategorie: oop

Signatur

create_function(string $args, string $code): string|false

Beschreibung

create_function() erzeugt zur Laufzeit eine anonyme Funktion, indem sie den übergebenen Argument-String und den Code-String per eval() auswertet. Die Funktion wird intern unter einem automatisch generierten Namen (z. B. \0lambda_1) registriert und dieser Name wird als Rückgabewert geliefert, sodass die Funktion wie ein normaler Callable verwendet werden kann.

Diese Funktion ist seit PHP 7.2.0 als veraltet (deprecated) markiert und wurde in PHP 8.0.0 vollständig entfernt. Für neuen Code sollte ausnahmslos eine echte anonyme Funktion (Closure) verwendet werden: $fn = function($args) { ... };. Closures sind typsicherer, schneller, garbage-collected und unterstützen use() für die Kontextübergabe.

Ein typischer historischer Einsatz war die Übergabe dynamisch erzeugter Callbacks an Funktionen wie usort(), array_map() oder array_filter(), wenn die Logik erst zur Laufzeit bekannt war.

Sicherheitshinweis: Da der Code-String direkt via eval() ausgeführt wird, ist die Funktion bei unkontrollierter Nutzung mit Benutzereingaben extrem anfällig für Code-Injection-Angriffe. Sie sollte niemals mit nicht vertrauenswürdigen Eingaben kombiniert werden.

Parameter

Name Typ Default Beschreibung
$args Pflicht string Die Parameterliste der zu erzeugenden Funktion als kommagetrennte Zeichenkette, z. B. '$a, $b'. Entspricht dem Inhalt der Klammern in einer normalen Funktionsdeklaration.
$code Pflicht string Der Funktionskörper als Zeichenkette. Wird intern per eval() ausgewertet. Darf keine öffnende oder schließende PHP-Tag enthalten. Beispiel: 'return $a + $b;'.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den intern generierten Funktionsnamen als String zurück (z. B. \0lambda_1), über den die Funktion aufrufbar ist. Im Fehlerfall (z. B. Syntaxfehler im Code-String) wird false zurückgegeben.

Beispiele

Einfacher Callback mit create_function (historisch)

<?php
// Veraltet – nur zur Illustration historischen Codes
$multiply = create_function('$a, $b', 'return $a * $b;');

echo $multiply(3, 4); // 12

$numbers = [5, 2, 8, 1, 9];
usort($numbers, create_function('$a, $b', 'return $a - $b;'));
print_r($numbers);
12 Array ( [0] => 1 [1] => 2 [2] => 5 [3] => 8 [4] => 9 )

Moderner Ersatz: Closure statt create_function

<?php
// Empfohlene moderne Alternative (PHP 5.3+)
$multiply = function(int $a, int $b): int {
    return $a * $b;
};

echo $multiply(3, 4); // 12

$numbers = [5, 2, 8, 1, 9];
usort($numbers, fn(int $a, int $b): int => $a - $b);
print_r($numbers);
12 Array ( [0] => 1 [1] => 2 [2] => 5 [3] => 8 [4] => 9 )

// Wichtig · Fallstricke

Deprecation & Entfernung: create_function() ist seit PHP 7.2.0 als deprecated markiert und seit PHP 8.0.0 nicht mehr verfügbar. Jede Verwendung in modernem Code muss durch eine echte Closure ersetzt werden.

Sicherheit: Da der Code-String intern über eval() ausgeführt wird, darf er unter keinen Umständen Benutzereingaben oder externe Daten enthalten, da dies zu willkürlicher Code-Ausführung führt (Remote Code Execution).

Speicher-Leck: In älteren PHP-Versionen werden per create_function() erstellte Funktionen im globalen Funktionsraum registriert und nie vom Garbage Collector bereinigt, was bei häufigem Aufruf zu Speicherproblemen führen kann – ein weiterer Grund, auf Closures umzusteigen.