create_function

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

create_functionErzeugt eine Funktion dynamisch durch Auswertung einer Zeichenkette mit Code

Warnung

Diese Funktion ist seit PHP 7.2.0 DEPRECATED (veraltet) und seit PHP 8.0.0 ENTFERNT. Von der Verwendung dieser Funktion wird dringend abgeraten.

Beschreibung

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

Erzeugt aus den übergebenen Parametern dynamisch eine Funktion und gibt einen eindeutigen Namen für sie zurück.

Achtung

Diese Funktion führt intern eval() aus und hat daher die gleichen Sicherheitsprobleme wie eval(). Außerdem zeigt diese Funktion ein schlechtes Verhalten in Bezug auf Leistung und Speicherverbrauch, da die erzeugten Funktionen global sind und nicht mehr freigegeben werden können.

Stattdessen sollten die nativ vorhandenen anonymen Funktionen verwendet werden.

Parameter-Liste

Normalerweise ist es ratsam, diese Parameter als Zeichenketten in einfachen Anführungszeichen zu übergeben. Wenn sie in doppelten Anführungszeichen übergeben werden, müssen die Variablennamen im Code sorgfältig maskiert werden, z. B. \$somevar.

args

Die Funktionsargumente in Form einer einzelnen durch Komma getrennten Zeichenkette.

code

Der Code der Funktion.

Rückgabewerte

Gibt einen eindeutigen Funktionsnamen als Zeichenkette zurück. Bei einem Fehler wird false zurückgegeben. Es ist zu beachten, dass der Name ein nicht druckbares Zeichen enthält ("\0"), weshalb Vorsicht geboten ist, wenn der Name gedruckt oder in eine andere Zeichenkette eingefügt werden soll.

Beispiele

Beispiel #1 Dynamisches Erzeugen einer Funktion, mit create_function() oder anonymen Funktionen

Eine dynamisch erstellte Funktion kann verwendet werden, um (zum Beispiel) eine Funktion aus Informationen zu erstellen, die zur Laufzeit gesammelt wurden. Zuerst unter Verwendung von create_function():

<?php
$newfunc 
create_function('$a,$b''return "ln($a) + ln($b) = " . log($a * $b);');
echo 
$newfunc(2M_E) . "\n";
?>

Und nun der gleiche Code unter Verwendung einer anonymen Funktion. Zu beachten ist, dass der Code und die Parameter nicht mehr in Zeichenketten eingebettet sind:

<?php
$newfunc 
= function($a,$b) { return "ln($a) + ln($b) = " log($a $b); };
echo 
$newfunc(2M_E) . "\n";
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

ln(2) + ln(2.718281828459) = 1.6931471805599

Beispiel #2 Erstellen einer allgemeinen Verarbeitungsfunktion mit create_function() oder anonymen Funktionen

Eine andere Verwendungsmöglichkeit wäre, eine allgemeine Verarbeitungsfunktion zu erstellen, die eine Reihe von Operationen auf eine Liste von Parametern anwenden kann:

<?php
function process($var1$var2$farr)
{
    foreach (
$farr as $f) {
        echo 
$f($var1$var2) . "\n";
    }
}

// Nun erzeugen wir eine Reihe mathematischer Funktionen
$farr = array(
    
create_function('$x,$y''return "etwas Trigonometrie: ".(sin($x) + $x*cos($y));'),
    
create_function('$x,$y''return "eine Hypotenuse: ".sqrt($x*$x + $y*$y);'),
    
create_function('$a,$b''if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}'),
    
create_function('$a,$b'"return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);"),
    
create_function('$a,$b''if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; }')
);

echo 
"\nWir benutzen nun das erste Array von dynamischen Funktionen\n";
echo 
"Parameter: 2.3445, M_PI\n";
process(2.3445M_PI$farr);

// Nun erzeugen wir eine Reihe von Funktionen zur Bearbeitung von Zeichenketten
$garr = array(
    
create_function('$b,$a''if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
    
'und \"$b\"\n** sehen für mich gleich aus! (unter Betrachtung der ersten 3 Zeichen)";'),
    
create_function('$a,$b''return "CRCs: " . crc32($a) . ", ".crc32($b);'),
    
create_function('$a,$b''return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)";')
    );
echo 
"\nWir benutzen nun das zweite Array von dynamischen Funktionen\n";
process("Twas brilling and the slithy toves""Twas the night"$garr);
?>

Hier ist noch einmal derselbe Code unter Verwendung einer anonymen Funktion. Es ist zu beachten, dass die Variablennamen in diesem Code nicht mehr maskiert werden müssen, da sie sich nicht in einer Zeichenkette befinden.

<?php
function process($var1$var2$farr)
{
    foreach (
$farr as $f) {
        echo 
$f($var1$var2) . "\n";
    }
}

// Nun erzeugen wir eine Reihe mathematischer Funktionen
$farr = array(
    function(
$x,$y) { return "etwas Trigonometrie: ".(sin($x) + $x*cos($y)); },
    function(
$x,$y) { return "eine Hypotenuse: ".sqrt($x*$x $y*$y); },
    function(
$a,$b) { if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;} },
    function(
$a,$b) { return "min(b^2+a, a^2,b) = " min($a*$a+$b$b*$b+$a); },
    function(
$a,$b) { if ($a && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; } }
);

echo 
"\nWir benutzen nun das erste Array von dynamischen Funktionen\n";
echo 
"Parameter: 2.3445, M_PI\n";
process(2.3445M_PI$farr);

// Nun erzeugen wir eine Reihe von Funktionen zur Bearbeitung von Zeichenketten
$garr = array(
    function(
$b,$a) { if (strncmp($a$b3) == 0) return "** \"$a\" " .
        
"und \"$b\"\n** sehen für mich gleich aus! (unter Betrachtung der ersten 3 Zeichen"; },
    function(
$a,$b) { return "CRCs: " crc32($a) . ", ".crc32($b); },
    function(
$a,$b) { return "similar(a,b) = " similar_text($a$b$p) . "($p%)"; }
);
echo 
"\nWir benutzen nun das zweite Array von dynamischen Funktionen\n";
process("Twas brilling and the slithy toves""Twas the night"$garr);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Wir benutzen nun das erste Array von dynamischen Funktionen
Parameter: 2.3445, M_PI
etwas Trigonometrie: -1.6291725057799
eine Hypotenuse: 3.9199852871011
b*a^2 = 4.8103313314525
min(b^2+a, a^2,b) = 8.6382729035898
ln(a)/b = 0.27122299212594

Wir benutzen nun das zweite Array von dynamischen Funktionen
** "Twas the night" und "Twas brilling and the slithy toves"
** sehen für mich gleich aus! (unter Betrachtung der ersten 3 Zeichen)
CRCs: 3569586014, 342550513
similar(a,b) = 11(45.833333333333%)

Beispiel #3 Gebrauch der anonymen Funktionen als Callback-Funktion

Wahrscheinlich liegt der häufigste Anwendungsfall für dynamische Funktionen darin, sie als Callbacks zu übergeben, also z. B. beim Gebrauch von array_walk() oder usort().

<?php
$av 
= array("the ""a ""that ""this ");
array_walk($avcreate_function('&$v,$k''$v = $v . "mango";'));
print_r($av);
?>

Umgewandelt in eine anonyme Funktion:

<?php
$av 
= array("the ""a ""that ""this ");
array_walk($av, function(&$v,$k) { $v $v "mango"; });
print_r($av);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Array
(
  [0] => the mango
  [1] => a mango
  [2] => that mango
  [3] => this mango
)

Sortieren von Zeichenketten von der längsten zur kürzesten mit create_function():

<?php
$sv 
= array("small""a big string""larger""it is a string thing");
echo 
"Original:\n";
print_r($sv);
echo 
"Sortiert:\n";
usort($svcreate_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>

Umgewandelt in eine anonyme Funktion:

<?php
$sv 
= array("small""a big string""larger""it is a string thing");
echo 
"Original:\n";
print_r($sv);
echo 
"Sortiert:\n";
usort($sv, function($a,$b) { return strlen($b) - strlen($a); });
print_r($sv);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Original:
Array
(
  [0] => small
  [1] => a big string
  [2] => larger
  [3] => it is a string thing
)
Sortiert:
Array
(
  [0] => it is a string thing
  [1] => a big string
  [2] => larger
  [3] => small
)

Siehe auch

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

Neuigkeiten für PHP-Entwickler: Laravel 11 Veröffentlichung

Am 12. März 2024 wurde die lang erwartete Version 11 des Laravel-Frameworks veröffentlicht, die eine Reihe von spannenden Neuerungen und Verbesserungen für die PHP-Entwicklungsgemeinschaft mit sich bringt. ...

Mike94

Autor : Mike94
Kategorie: PHP Magazin

Technisches SEO bleibt relevant

Technisches SEO – Was ist das überhaupt? Technisches SEO bezieht sich auf die Optimierung der technischen Aspekte deiner Webseite. Das Ziel ist klar! ...

admin

Autor : admin
Kategorie: SEO & Online-Marketing

Was ist neu in der PHP 8.2.10

PHP 8.2.10 ist eine der neuesten Versionen von PHP, die eine Reihe von Verbesserungen und neuen Funktionen mit sich bringt. In diesem Artikel werden wir einige der herausragenden Neuerungen und Verbesserungen dieser Version diskutieren. ...

admin

Autor : admin
Kategorie: Software-Updates

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

Seltsames Verhalten von execute() oder Fehler meinerseits

Hallo liebe Community, ich habe ein kleines Problem und vielleicht kann mir ja jemand helfen, würde ich mich sehr drüber freuen. Unten steht e ...

Geschrieben von garibaldiwz am 22.03.2024 13:03:12
Forum: SQL / Datenbanken
Google reCAPTCHA in Kontaktformular einbinden

Überprüfen Sie den E-Mail-Versand: Stellen Sie sicher, dass die E-Mail-Funktion mail() ordnungsgemäß funktioniert und dass keine Fehler beim V ...

Geschrieben von Gast am 18.03.2024 04:54:16
Forum: PHP Developer Forum
`count.php`

Hallo cober93327, und Danke fuer deine Antwort! :-) Naja, so einen "Besucherzähler" auf der Webseite anzuzeigen ist schon eher etwas, das man a ...

Geschrieben von kekse1 am 17.03.2024 15:56:38
Forum: Projekthilfe
`count.php`

Es gibt dazu natuerlich auch eine recht ausfuehrliche Dokumentation in meinem GitHub-Repository Es würde meiner Ansicht nach enorm helfen, wenn D ...

Geschrieben von cober93327 am 14.03.2024 15:49:28
Forum: Projekthilfe