在匿名函数上带有“使用”的动态元素

时间:2019-10-14 12:57:14

标签: php

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

例如,我有这种脚本:

$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;
    };
}

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

谢谢

2 个答案:

答案 0 :(得分: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'));

答案 1 :(得分:0)

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

syn match RedLine "^\*\*\*  .*  \*\*\*$" skipnl nextgroup=BlueLine
syn match BlueLine ".*" contained