【问题标题】:Pass variable from loop to function将变量从循环传递到函数
【发布时间】:2023-03-17 23:39:01
【问题描述】:

我使用 Php 不到 2 个月(这也是我的第一个问题,如果我遗漏了什么,请告诉我),直到今天它一直很顺利。我正在为 Wordpress 开发一个表单插件,目前正在实现代码以使保存在数据库中的表单与包含数据库中表单 ID 的简码连接。第一种形式的 ID 为 1,简码为 IForm_1。很简单。

当循环遍历所有表单并且无法将循环中的 $ID 值传递给 IForm 函数时,会出现问题。

 $ID= 0;
 $FormID= 0;
 settype($ID, "integer");

   for ($x = 1; $x <= 300; $x++) {
        global $ID;
        $ID++;
        $ShortCode = "IForm_";
        $ShortCode .= $ID;
        $FormID = $ID;
       add_shortcode( $ShortCode, 'IForm_Array' );
        $ShortCode ='';
}

这是一个非常简单的循环,当 $ShortCode 与网站上使用的简码对齐时,它可以正常工作,并且 IForm 会得到应有的使用。

function IForm(){
    global $ID;
    //testing_decode();
    // Gets the value of baseTest from getDB and puts it in test.
    $DBForm = getDB($ID);
    $Form = $DBForm;
    $Form .=  "Works but not really";
    return $Form;

}

这里是函数。

问题是 $ID 在循环结束的函数中始终为 300。当循环中的 $ID 与站点/帖子上的简码 ID 对齐时执行 IForm,这告诉我 $ID 值对于循环的某些部分确实是正确的。当 ID 确实正确时,我想将其传递给 IForm 函数以使用它在数据库(MySQL)中找到正确的表单。

现在我的问题是如何将循环第 3 行的 $ID 值传递(如果可以的话)到函数的第 5 行。或者是在循环排列时强制中断循环并使用最后一个 $ID 值传递给 IForm。

【问题讨论】:

    标签: php wordpress loops variables


    【解决方案1】:

    WordPress 使这比它需要的复杂一点,因为您无法将其他参数传递给短代码 (afaik)。

    在开始之前,让我们了解一下 300。添加短代码的循环在页面加载的早期阶段执行。在稍后阶段对您的简码函数的实际调用。届时,全局 $ID 变量将具有其最终值(在您的情况下为 300)

    这里有两种方法可以解决这个问题:

    首先,您可以使用闭包,并从父作用域继承 $ID:

       for ($x = 1; $x <= 300; $x++) {
        $ID++;
        $ShortCode = "IForm_";
        $ShortCode .= $ID;
        $FormID = $ID;
        add_shortcode( $ShortCode, function () use ($ID) {
          $DBForm = getDB($ID);
          $Form = $DBForm;
          $Form .=  "Works but not really";
          return $Form;
        } );
        $ShortCode ='';
    }
    

    您可以在manual 中了解更多信息。同时也解释了use和全局变量的区别。

    其次,您可以使用简码属性。你不会再使用[Form_1],而是[Form id=1]。然后,您可以访问 Wordpress 自动传递给您的函数的数组中的 id。

    function IForm($attr){
      $ID = intval($attr['id']); // A little sanitation, because $attr could come from a user with low privileges
      $DBForm = getDB($ID);
      $Form = $DBForm;
      $Form .=  "Works but not really";
      return $Form;
    }
    

    here 提供了一些关于此的文档。

    【讨论】:

    • 谢谢!我不知道您可以在短代码参数的 $func 部分中这样做。我在其他插件中看到的第二部分,但从未看到实现它的原因。 Form id= 1 而不是 Form_1 的优点是什么?
    【解决方案2】:

    让我们看看你在那里做了什么

    $ID= 0;
    // Define a variable called ID
    
       for ($x = 1; $x <= 300; $x++) {
            global $ID;
            // get access to global variable id
            $ID++;
            // increment local or global counter, undefined behaviour 
    

    我建议这样做

    global $ID;
    
    for ($x = 1; $x <= 300; $x++) {
      $ID++;
      // Do what you think you have to do
    

    不要通过全局变量将变量传递给函数,而是使用参数

    function IForm($id){
      //testing_decode();
    
      $DBForm = getDB($id);
      $Form = $DBForm;
      $Form .=  "Works very good";
      return $Form;
    }
    

    并像

    一样调用函数
    IForm(42); //or 
    IForm($ID);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多