PHP中的动态函数调用

时间:2010-12-29 18:25:42

标签: php

是否可以在PHP中进行动态函数调用?我不知道我是否称它为正确的名字,但我希望这个例子可以解释我想要的东西。

<?
    function image_filename(){
        global $the_image;
        return return $the_image->filename;
    }
    function image_anchor(){
        global $the_image;
        return getAnchor($the_image->id);
    }
    // is there a way to make a function that will do something like this:
    // I know it's possible using a class and __call, but is it possible for a general case
    function image_REQUEST(){
        global $the_image;
        $args = func_get_args();
        switch(REQUEST){
            case "filename":
                return $the_image->filename;
            break;
            case "anchor":
                return getAnchor($the_image->id);
            break;
        }
    }
?>

澄清:

我了解变量函数,call_user_func。这些不是我想要的。基本上,我不想定义image_filenameimage_anchor,而是在调用它们时定义它们。

8 个答案:

答案 0 :(得分:3)

对于未在类中定义的函数,无法定义“magic”或“dynamic”函数(如__call)。但是,您可以动态地调用函数。有几种方法可以做到这一点 - 我建议使用call_user_func_array()函数,它允许你调用一个函数,将它的参数作为数组传递。

例如:

$type = 'filename';
call_user_func_array("image_$type", $args);

有关详细信息,请参阅http://php.net/manual/en/function.call-user-func-array.php

答案 1 :(得分:1)

你的意思是变量函数?

<?php

function user_func($x) { echo $x; }

$x = "user_func";
$x(1);

?>

http://php.net/manual/en/functions.variable-functions.php

要动态创建函数,请使用create_function(http://ca3.php.net/create-function):

<?php
$func = create_function('$x', 'echo $x;');
$func(1);

?>

您可以将它们存储在数组中:

<?php
$funcs = array();
$funcs['error'] = create_function('$x', 'echo $x;');
?>

答案 2 :(得分:0)

但不要。除非你喜欢让未来的程序员追捕你,然后把你放在人行道上。

答案 3 :(得分:0)

使用类似:

$image_request = 'image_' + REQUEST;
echo $image_request();
// lets say REQUEST = filename, then above will echo the result of function: image_filename();

这些被称为variable functions,基本是您将函数的名称存储在变量中,比如说$var,然后使用:$var()调用函数。

另外,正如您在对BoltClock的评论中所述,如果您对某种动态函数集感兴趣,为什么不使用这样的东西:

function image_functions(REQUEST) {
    switch (REQUEST) {
    // ...
    }
}

答案 4 :(得分:0)

这是你在找什么?

function foo() {
// code ...
}

$functionName = "foo";

$functionName();

答案 5 :(得分:0)

http://php.net/manual/en/function.call-user-func.php

<?php
function increment(&$var)
{
    $var++;
}

function decrement(&$var)
{
    $var--;
}

$a = 5;
$func = "increment";
call_user_func($func, $a);
echo $a."\n";

$func = "decrement";
call_user_func($func, $a);
call_user_func($func, $a);
echo $a."\n";;
?>

产生

6
4

答案 6 :(得分:0)

您也可以进行简单的字符串替换。

<?php
$action = $_REQUEST['action'];
$functionName = 'image_' . $action;
if (function_exists($functionName)) {
    $functionName($the_image);
} else {
  echo "That function is not available";
}

就是这样。我添加了额外的错误检查,这样您就不会尝试运行不存在的函数。

答案 7 :(得分:0)

我不明白为什么你不只是将REQUEST作为参数,而是可以在eval()调用中定义函数。

function makeFunction($name)
{
    $functionName = "process_{$name}";

    eval("
        function {$functionName}() {
            echo \"Hi, this is {$functionName}.\\n\";
        }
    ");
}

makeFunction("Hello");

process_Hello();

祝你好运。