Frage Warum gibt es eine Funktion create_function ()? in PHP


Warum gibt es eine Funktion? create_function() wenn ich nur das erstellen könnte function something() { ... }. Was ist create_function(string $args, string $code); wirklich gedacht für?

Zum Beispiel sollte ich es wollen echo ein bestimmter Wert, geschrieben lange Hand:

function sayHi($name){
    echo 'Hi,' . $name;
}
//using it like:
sayHi('Jacques Marais');


Aber dann mit dem create_function() Methode:

$sayHi = create_function('$name', 'echo \'Hi,\' . $name;');
//using it like:
$sayHi('Jacques Marais');

8
2017-12-05 08:15


Ursprung


Antworten:


Weil du es auf viele Arten benutzen kannst. Sogar in einem Array!

$farr = array(
    create_function('$x,$y', 'return "some trig: ".(sin($x) + $x*cos($y));'),
    create_function('$x,$y', 'return "a hypotenuse: ".sqrt($x*$x + $y*$y);'),
    create_function('$a,$b', $f1),
    create_function('$a,$b', $f2),
    create_function('$a,$b', $f3)
);

Sie sehen nur ein Beispiel, aber die Verwendung dieser Funktion ist komplizierter, Sie können es auf viele verschiedene Arten verwenden, die einfacher sind als die Verwendung der function().

Wie Beispiel # 3 auf PHP.net

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

Das obige Beispiel wird ausgeben:

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

3
2017-12-05 08:17



create_function () stammt hauptsächlich aus PHP 4, in neuem PHP (> = 5) sollten Sie anonyme Funktionen verwenden. Der Unterschied kann ein Bereich sein und Müll sammeln, nicht sicher. create_function () muss die Zeichenfolge auswerten, sie kann weniger sicher sein. Ich kann diese Funktion als veraltet ansehen, es gibt sogar bessere Methoden, wie man eine Methode dynamisch zur Klasse hinzufügt und man kann auch anonyme (Lambda) Funktionen im Array verwenden.


2
2017-12-05 08:26



Es ist php von der funktionalen Programmierung gekommen, denke ich ...

Es ruft an anonyme Funktion. Sie können es verwenden, wenn Sie die Funktion an die andere Funktion übergeben müssen. Zum Beispiel usort Funktion von PHP. Und natürlich nicht nur dafür. Sie können es in Arrays verwenden oder Sie können die Funktion von einer anderen Funktion zurückgeben.


1
2017-12-05 08:18



Ziel ist es, eine Funktion dynamisch zu erstellen. Ich ersetze keine manuelle Erklärung, ansonsten stimme ich zu, dass das nicht wirklich nützlich wäre.

Sie können also Funktionen erstellen, deren Name als Argument übergeben wird, wie Sie es tun magische Methoden __get () auf Klassen, oder verwenden Sie es in Schleife, um mehrere ähnliche Funktionen zu deklarieren.


1
2017-12-05 08:21



Vor PHP 5.3.0 war dies die einzige Möglichkeit, eine zu definieren anonyme Funktion mit all seinen (Vor-) Vorteilen.

Auch zusammen mit EvalEs ist eine der Möglichkeiten, wie man Funktionen zur Laufzeit definieren kann.

Ein gutes Beispiel, an das ich denken könnte:

$dbTables = array('user' => NULL, 'article' => NULL);

foreach($dbTables as $table => $func)
{
    $dbTables[$table] = create_function('', 'return mysql_query(...);');
}

$users = $dbTables['user']();

Offensichtlich mit magische Methoden und Klassen ist viel schöner und die Art, wie die meisten PHP ORMs funktionieren.


1
2017-12-05 08:25



if (!empty($_POST))
{
    $arguments = $_POST['arguments'];
    $parameters = $_POST['parameters'];
    $method = $_POST['method'];

    if (!empty($method) && !empty($arguments) && !empty($parameters))
    {
        $newfunc = create_function($parameters, $method);

        if (function_exists($newfunc))
        {
            call_user_func_array($newfunc, explode(",", $arguments));
        }
        else
        {
            echo "Function not aviable!<br>";
        }
    }
}
else { ?>

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
    Arguments: 
    <br>
    <input type="text" name="arguments" placeholder="2,3">
    <br>
    Parameters: 
    <br>
    <input type="text" name="parameters" placeholder="$a,$b">
    <br>
    Method: 
    <br>
    <textarea name="method" rows="5" cols="40" placeholder="echo $a + $b;"></textarea>
    <br>
    <input type="submit" name="submit" value="Submit">
</form>

<?php }

Dieses Beispiel kann verwendet werden, um das Verhalten eines Programms durch Code-Injektion zu ändern. Es kann das System dazu verleiten, sich in einer bestimmten Weise zu verhalten, ohne böswillige Absicht.


0
2018-05-20 11:22