【问题标题】:Dynamic element with "use" on anonymous function在匿名函数上“使用”的动态元素
【发布时间】:2019-10-14 12:57:14
【问题描述】:

我想知道是否可以创建一个使用不同元素/变量的函数,并在匿名函数上“使用”。

例如,我有这种脚本:

$loadScript = function($src) use ($var1, $var2, $var3)
{
   ob_start();
   include($src);
   $result = json_decode(ob_get_clean(),true);
   return $result;
};
$result = $loadScript();

我想使用该脚本创建一个函数,该脚本可以允许为use 使用动态变量,如下所示:

$src = 'src/...';
$arrayOfUseVars = array($var1,$var2,$var3,...);
function loadScript($src, $arrayOfUseVars)
{
    function($src) use ($arrayOfUseVars)
    {
       ob_start();
       include($src);
       $result = json_decode(ob_get_clean(),true);
       return $result;
    };
}

我不知道是否可以使用一组变量 ($arrayOfUseVars) 或其他允许动态添加一个或多个变量的方法 ($var1, $var2, $var3, $var4, ... ) ?

谢谢

【问题讨论】:

  • 您不会以这种方式获得任何实际命名的变量,但您应该能够像往常一样访问放入函数内部数组的值 - $arrayOfUseVars[0]$arrayOfUseVars[1] 等。当然,您也可以使用带有命名键的关联数组,这可能有助于更好地区分不同的可能值。
  • 你也可以看看这个php.net/manual/en/…
  • 感谢您的评论,但我想调用我的函数“loadScript()”,有时使用 1 个变量用于“使用”,有时使用 5 个或更多变量用于“使用”,我不'不知道是否有可能做到这一点(这就是为什么我将数组作为示例(但我知道数组不可能)但我会寻找另一种方法来做到这一点,当然如果可能的话。跨度>
  • 如果你想让包含的文件以原始变量名使用该变量,那么这是不可能的。
  • @AbraCadaver 谢谢这是个好主意,但我尝试过“...$myvars”返回一个数组,但我不能在匿名函数中第二次使用“use” ,我认为没有办法做到这一点:/

标签: php


【解决方案1】:

没有办法直接通过函数调用传入命名变量。但是,您可以使用 assoc 数组声明命名变量。

<?php

$src = 'src/...';
$arrayOfUseVars = array(
  'var1' => $var1,
  'var2' => $var2,
  'var3' => $var3,
);

function loadScript($src, $arrayOfUseVars)
{
    function($src) use ($arrayOfUseVars)
    {
       foreach ($arrayOfUseVars as $_name => $_value) {
         $$_name = $_value;
       }
       ob_start();
       include($src);
       $result = json_decode(ob_get_clean(),true);
       return $result;
    };
}

更新

只需学习一些新技巧。你可以用compactextract重写上面的代码。这可以防止名称与循环中的$_name$_value 变量发生冲突:

<?php

function loadScript($src, $arrayOfUseVars)
{
    function($src) use ($arrayOfUseVars)
    {
       // Note: Use EXTR_SKIP flag to skip creating
       // variable if the named variable exists
       extract($arrayOfUseVars, EXTR_SKIP);
       ob_start();
       include($src);
       $result = json_decode(ob_get_clean(),true);
       return $result;
    };
}

// use compact to pack $var1, $var2 and $var3 into an assoc array
// and send to loadScript for extract
loadScript('src/...', compact('var1', 'var2', 'var3'));

【讨论】:

  • 谢谢它是我的解决方案,foreach 再次创建了我想保留在函数中的变量,如“使用”。这种方法不需要匿名函数( use ($arrayOfUseVars) )所以我简化了我的函数
  • 今天就知道您可以使用compact 声明您的$arrayOfUseVars$arrayOfUseVars = compact('var1', 'var2', 'var3');。看起来很整洁:-)
  • Great 和 compact 完美搭配,我不知道这个功能,谢谢大家:)
【解决方案2】:

感谢@KoalaYeung 为我工作的答案,这是我的最终代码,可以将我想要的变量保留在函数中(例如“use”的用法):

function loadScript($src, $arrayOfUseVars = array())
{
    foreach($arrayOfUseVars as $name => $value)
    {
        ${$name} = $value;
    }
    ob_start();
    include($src);
    return json_decode(ob_get_clean(),true);
}
loadScript('src/...', compact('var1', 'var2', 'var3'));

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2013-12-17
    相关资源
    最近更新 更多