【问题标题】:calling php function from string (with parameters)从字符串调用php函数(带参数)
【发布时间】:2011-09-08 09:12:49
【问题描述】:

我想使用这个字符串动态运行一个 php 函数:

do_lightbox('image1.jpg', 'picture 1')

我已经像这样解析了字符串:

$exe = "do_lightbox";
$pars = "'image1.jpg', 'picture 1'";

并尝试使用以下代码:

$rc = call_user_func($exe, $pars);

不幸的是,这给了我一个错误 - 我也尝试过像

那样拆分 $pars
$pars = explode(',', $pars);

但没有帮助..

有什么想法吗? 谢谢

【问题讨论】:

  • 这个问题是一个症状,表明您的应用程序架构有问题。
  • 您是否有特殊原因要这样做,它可能会导致安全问题,但这只是意味着您要编写更多代码行以获得相同的效果...您可以更改传递给函数的参数,以便动态加载(如您所愿)。
  • 它用于将文本块嵌入到我将执行的 html 代码中。

标签: php function dynamic


【解决方案1】:

我想这就是你所追求的:

$exe = "do_lightbox";
$pars = array('image1.jpg', 'picture 1');

$rc = call_user_func_array($exe, $pars);

【讨论】:

    【解决方案2】:

    $pars 必须是一个包含参数的数组。应该是:array('image1.jpg', 'picture 1'),但使用你的方法,它是:array("'image1.jpg'", " 'picture 1'"),这不是你要找的。​​p>

    【讨论】:

      【解决方案3】:

      这是call_user_func() 工作原理的示例:

      function myfunc($p1,$p2){
          echo "first: $p1, second: $p2\n";
      }
      
      $a1="someval";
      $a2="someotherval";
      call_user_func("myfunc",$a1,$a2);
      

      这里与前面示例的不同之处在于您不必在单个数组中传递每个参数。此外,您可以解析分隔字符串数组并执行相同的操作:

      function myfunc($p1,$p2){
          echo "first: $p1, second: $p2\n";
      }
      
      $a="someval, someotherval";
      $e=explode(", ",$a);
      $a1=$e[0];
      $a2=$e[1];
      call_user_func("myfunc",$a1,$a2);
      

      【讨论】:

        【解决方案4】:

        最好使用call_user_func_array,它允许您像数组一样传递参数:

        call_user_func_array($exe, $pars);
        

        您也可以使用eval 直接解析字符串(但我不推荐这样做):

        eval("do_lightbox('image1.jpg', 'picture 1')");
        

        哪个会执行你的函数。

        【讨论】:

        • 对不起,是的,我第一次输入错误的 exec 和 eval,我的道歉。仍然 eval 不是要走的路!
        • 不,您确实首先使用了 exec。 Exec 启动一个外部程序,参数是命令行,这不是这里的意图。显然,您编辑了您的帖子,所以这不再是错误的了。
        【解决方案5】:

        虽然我想知道你为什么需要这样的功能(安全问题),但这里有一个解决方案:

        $exe = "do_lightbox";
        $pars = "'image1.jpg', 'picture 1'";
        call_user_func_array($exe, explode(',', $pars));
        

        您可能还想去掉图像文件名周围的单引号和空格。

        【讨论】:

          【解决方案6】:

          尽管强烈建议您使用 eval 函数:

          eval("do_lightbox('image1.jpg', 'picture 1')")
          

          【讨论】:

          • 通常需要避免使用 eval,尤其是当语言为您提供 call_user_func_array 或 ReflectionMethod 等工具时。
          • 我同意。然而,从问题来看,输入似乎是一个带有函数和参数的字符串。解析用于向 call_user_func_array 输入的字符串应该很难,我会​​这样做,只是提供一个替代方案。
          猜你喜欢
          • 1970-01-01
          • 2015-01-21
          • 1970-01-01
          • 2021-02-03
          • 2010-12-19
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          相关资源
          最近更新 更多