如何从存储在Variable中的字符串调用PHP函数

时间:2009-06-17 08:44:23

标签: php dynamic-function

我需要能够调用一个函数,但是函数名存储在一个变量中,这可能吗? e.g:

function foo ()
{
  //code here
}

function bar ()
{
  //code here
}

$functionName = "foo";
// i need to call the function based on what is $functionName

Anyhelp会很棒。

谢谢!

16 个答案:

答案 0 :(得分:431)

答案 1 :(得分:96)

我最喜欢的版本是内联版本:

${"variableName"} = 12;

$className->{"propertyName"};
$className->{"methodName"}();

StaticClass::${"propertyName"};
StaticClass::{"methodName"}();

您也可以在括号内放置变量或表达式!

答案 2 :(得分:17)

是的,有可能:

function foo($msg) {
    echo $msg."<br />";
}
$var1 = "foo";
$var1("testing 1,2,3");

来源:http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2

答案 3 :(得分:16)

正如已经提到的,有几种方法可以实现这一点,可能最安全的方法是call_user_func(),或者如果必须的话,你也可以走$function_name()的路线。可以使用这两种方法传递参数

$function_name = 'foobar';

$function_name(arg1, arg2);

call_user_func_array($function_name, array(arg1, arg2));

如果您调用的函数属于某个对象,您仍然可以使用其中任何一个

$object->$function_name(arg1, arg2);

call_user_func_array(array($object, $function_name), array(arg1, arg2));

但是,如果您要使用$function_name()方法,如果名称以任何方式动态,则测试函数是否存在可能是个好主意

if(method_exists($object, $function_name))
{
    $object->$function_name(arg1, arg2);
}

答案 4 :(得分:12)

如果其他人被谷歌带到这里,因为他们试图将变量用于某个类中的方法,下面是一个实际可行的代码示例。以上都不适用于我的情况。关键区别在于&声明$c = & new...&$c传递call_user_func

我的具体情况是实现某人的代码与csscolor.php类中的颜色和两个成员方法lighten()darken()有关。无论出于何种原因,我想让相同的代码能够调用变亮或变暗而不是用逻辑选择它。这可能是我不仅仅使用if-else或更改调用此方法的代码的固执的结果。

$lightdark="lighten"; // or optionally can be darken
$color="fcc";   // a hex color
$percent=0.15;  
include_once("csscolor.php");
$c = & new CSS_Color($color);
$rtn=call_user_func( array(&$c,$lightdark),$color,$percent);

请注意,使用$c->{...}尝试任何操作都无效。在call_user_func的php.net页面底部仔细阅读读者提供的内容后,我能够将上述内容拼凑在一起。另请注意,$params作为数组对我来说不起作用

// This doesn't work:
$params=Array($color,$percent);
$rtn=call_user_func( array(&$c,$lightdark),$params);

上述尝试会对预期第二个参数(百分比)的方法发出警告。

答案 5 :(得分:12)

迟了几年,但这是现在最好的方式:

$x = (new ReflectionFunction("foo"))->getClosure();
$x();

答案 6 :(得分:9)

为了完整起见,您还可以使用eval()

$functionName = "foo()";
eval($functionName);

然而,call_user_func()是正确的方法。

答案 7 :(得分:6)

动态函数名称和名称空间

在使用命名空间时,只需添加关于动态函数名称的观点。

如果您正在使用名称空间,以下将不起作用,除非您的函数位于全局名称空间中:

namespace greetings;

function hello()
{
    // do something
}

$myvar = "hello";
$myvar(); // interpreted as "\hello();"

怎么办?

您必须改为使用call_user_func()

// if hello() is in the current namespace
call_user_func(__NAMESPACE__.'\\'.$myvar);

// if hello() is in another namespace
call_user_func('mynamespace\\'.$myvar);

答案 8 :(得分:3)

如果你想调用一个对象的方法,可以补充@Chris K的答案,你可以在一个闭包的帮助下使用一个变量来调用它:

function get_method($object, $method){
    return function() use($object, $method){
        $args = func_get_args();
        return call_user_func_array(array($object, $method), $args);           
    };
}

class test{        

    function echo_this($text){
        echo $text;
    }
}

$test = new test();
$echo = get_method($test, 'echo_this');
$echo('Hello');  //Output is "Hello"

我发布了另一个例子here

答案 9 :(得分:2)

使用call_user_func函数。

答案 10 :(得分:2)

我从这个问题和答案中学到了什么。谢谢大家!

让我说一下这些变量和函数:

$functionName1 = "sayHello";
$functionName2 = "sayHelloTo";
$functionName3 = "saySomethingTo";

$friend = "John";
$datas = array(
    "something"=>"how are you?",
    "to"=>"Sarah"
);

function sayHello()
{
echo "Hello!";
}

function sayHelloTo($to)
{
echo "Dear $to, hello!";
}

function saySomethingTo($something, $to)
{
echo "Dear $to, $something";
}
  1. 要调用功能不带参数

    // Calling sayHello()
    call_user_func($functionName1); 
    
      

    你好!

  2. 使用一个参数调用函数

    // Calling sayHelloTo("John")
    call_user_func($functionName2, $friend);
    
      

    尊敬的约翰,你好!

  3. 使用1个或多个参数调用函数 如果您动态调用函数并且每个函数具有不同数量的参数,这将很有用。这是我一直在寻找(并解决)的情况。 call_user_func_array 是关键

    // You can add your arguments
    // 1. statically by hard-code, 
    $arguments[0] = "how are you?"; // my $something
    $arguments[1] = "Sarah"; // my $to
    
    // 2. OR dynamically using foreach
    $arguments = NULL;
    foreach($datas as $data) 
    {
        $arguments[] = $data;
    }
    
    // Calling saySomethingTo("how are you?", "Sarah")
    call_user_func_array($functionName3, $arguments);
    
      

    亲爱的莎拉,你好吗?

再见!

答案 11 :(得分:1)

以下代码可以帮助在PHP中编写动态函数。 现在,函数名称可以通过变量&#39; $ current_page&#39;。

动态更改
$current_page = 'home_page';
$function = @${$current_page . '_page_versions'};
$function = function() {
    echo 'current page';
};
$function();

答案 12 :(得分:1)

如果您在对象上下文中尝试动态调用函数,请尝试以下代码:

$this->{$variable}();

答案 13 :(得分:0)

使用存储在变量中的名称安全地调用函数的最简单方法是

//I want to call method deploy that is stored in functionname 
$functionname = 'deploy';

$retVal = {$functionname}('parameters');

我曾经使用过如下所示的方法在Laravel中动态创建迁移表,

foreach(App\Test::$columns as $name => $column){
        $table->{$column[0]}($name);
}

答案 14 :(得分:-2)

我想到的一种非常规方法是,除非你通过一些写自己的超自治AI生成整个代码,否则很有可能你想要的功能#34;动态&#34; call,已在您的代码库中定义。那么为什么不检查字符串并做臭名昭着的ifelse舞蹈来召唤......你明白我的观点。

例如

if($functionName == 'foo'){
  foo();
} else if($functionName == 'bar'){
  bar();
}

如果您不喜欢switch-case阶梯的温和味道,即使ifelse也可以使用。

我知道有些情况下&#34; 动态调用函数&#34;绝对必要(像一些修改自己的递归逻辑)。但是大多数日常琐碎的用例都可以被躲避。

它会从您的应用程序中消除很多不确定性,同时如果字符串与任何可用的函数都不匹配,则可以执行回退功能。定义。 IMHO。

答案 15 :(得分:-8)

我不知道为什么你必须使用它,对我来说听起来不是很好,但是如果只有少量的功能,你可以使用if / elseif结构。 我不知道是否可以直接解决。

等等 $ foo =“bar”; $ test =“foo”; echo $$ test;

应该返回吧,你可以尝试一下,但我不认为这适用于功能