为什么有一个函数create_function()?用PHP

时间:2013-12-05 08:15:07

标签: php function

如果我可以创建create_function(),为什么会有function something() { ... }函数。 create_function(string $args, string $code);真正意味着什么?

例如,我应该echo特定值,写得很长:

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


但是然后使用create_function()方法:

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

6 个答案:

答案 0 :(得分:4)

因为你可以在很多方面使用它..即使在阵列中!

$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)
);

你只看一个例子,但是这个函数的使用更复杂,你可以用许多不同的方式使用它,这比使用function()更容易。

与PHP.net上的示例#3类似

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

以上示例将输出:

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

答案 1 :(得分:2)

create_function()主要来自PHP 4,在新的PHP(&gt; = 5)中你应该使用匿名函数。差异可能是范围和垃圾收集,不确定。 create_function()必须评估字符串,它可能不太安全。我可以看到该函数已被弃用,有更好的方法甚至如何动态地向类添加方法,你也可以在数组中使用匿名(lambda)函数。

答案 2 :(得分:1)

我想从功能编程来到php ...

它正在呼叫anonymous function。如果需要将函数传递给另一个函数,可以使用它。例如php的usort功能。当然不仅仅是为了这个。您可以在数组中使用它,也可以从其他函数返回该函数。

答案 3 :(得分:1)

目标是动态创建功能。不替换手动声明,否则我同意这不会真正有用。

因此,您可以创建名称作为参数传递的函数,就像在类上使用magic methods __get()一样,或者在循环中使用它来声明几个类似的函数。

答案 4 :(得分:1)

在PHP 5.3.0之前,这是唯一可以定义anonymous function并具有所有(dis)优势的方法。

此外,与eval一起,它是人们在运行时定义函数的方法之一。

我能想到的一个很好的例子:

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

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

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

显然使用magic methods和类更好,而且大多数PHP ORM的工作方式都很好。

答案 5 :(得分:0)

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 }

此示例可用于通过代码注入更改程序的行为。它可以&#34;技巧&#34;系统以某种方式表现而没有任何恶意。