【问题标题】:How to call a function with a parameter as string in php?如何在php中调用带有参数作为字符串的函数?
【发布时间】:2014-04-13 04:53:18
【问题描述】:

我在这里寻找与解决方案类似的东西>>Call function from string stored in a variable,但有一个区别:

我也想传递一个参数。

例如:

   function foo($myvar) {

   }


   $function = 'foo';
   $values = Array('myvar'=>1, 'myvar2'=>2);

   if(function_exists($function)) {
      // call the function using $function, 
      // and pass the value $values -- aka   $function($values)

   }

任何可行的解决方案将不胜感激。理想情况下,我想将它与以下类一起使用:

   class bar {

   function foo($myvar) {

   }

   }


   $function = 'foo';
   $values = Array('myvar'=>1, 'myvar2'=>2);

   if(function_exists($function)) {
      // call the function using $function, 
      // and pass the value $values -- aka   $bar::$function($values)

   }

【问题讨论】:

  • 我看不出问题出在哪里?你能举一个会导致问题的例子吗/
  • 这不是问题---我的问题是如何将变量传递给函数名称存储在变量中的函数。直接调用函数不是问题。如果您查看我添加的 SO 链接,它会给出如何在字符串中调用函数的答案,但如果我也希望将变量传递给该函数,则不会。 -- 所以这只是我需要的解决方案的 50%

标签: php function class


【解决方案1】:

您可以在传递参数的对象上调用函数,使用变量,如下所示:

$myBar = new bar(); // usually class names have uppercase first letters though
$myClassname = 'bar';
call_user_func(array($myBar, $function), $values); // method on object
call_user_func(array($myClassname, $function), $values); // class (static) method
call_user_func($myClassname.'::'.$function); // PHP 5.2.3 and higher
// if you had another function $function2 whose args were a list of parameters instead of an array:
call_user_func($myBar, $function2, $param1, $param2, $param3);

更多信息和示例请访问http://us1.php.net/call_user_func

【讨论】:

  • 类本身也可以这样调用吗?例如,在您的示例中,该类是已知的并且是静态的 --- 但类似于 $foo = 'bar'; $mybar = new $foo; ?或者更具体地说,像$foo::$myfunction($params) 这样静态地调用它,所以所有部分都可以是动态的
  • 太棒了 --- 谢谢 :) -- 大声笑......我必须等待接受答案 XD
  • 不客气!希望能帮助到你。 (啊,我们会为赞成或绿色复选标记做的事情;)
  • :) ...我有一个后续问题...呵呵...稍微复杂一些,但是关于这个主题-基本上,我正在编写一个事件类(所以我可以raiseevents 来自其他函数/类/等)。 PHP 似乎没有任何真正的基于事件的系统。
【解决方案2】:

这有帮助吗?

function process_function($function_param){
 $function_param = explode("|",$function_param);
   if(function_exists($function_param[0])) {
      call_user_func_array($function_param[0],$function_param[1]);
   }
}

【讨论】:

  • 也是一个很好的解决方案。允许传递函数名和一个参数。 RobP 首先回答并且更彻底,但是无论如何都要寻求体面的解决方案:) 谢谢。
【解决方案3】:

我认为您正在寻找method_exist(),它将检查对象是否具有特定方法。

这是您的解决方案。

class bar {
   function foo($myarr){
        foreach($myarr as $val){
            echo $val ."<br />" ;
            //prints 1 and 2
        }
   }
}

$myfunc = new bar(); //creating object 
$values = Array('myvar'=>1, 'myvar2'=>2);

//checking object has method foo
if(method_exists($myfunc, 'foo')) {
    $myfunc->foo($values);
}

【讨论】:

  • 谢谢....这也很有帮助。我希望我们可以将所有 3 个答案组合成一个解决方案。这对于通过字符串调用函数并没有真正的帮助,但它确实有助于检查类中函数的存在。
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 2014-07-29
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 2014-04-11
相关资源
最近更新 更多