PHP回调函数中的动态变量

时间:2019-01-06 04:46:37

标签: php

我不知道这是否真的可以完成,但这是问题:

我有一个私有函数来返回选项数组,这些选项指示回调和其他选项,例如模板,表单等。这里是代码:

  /**
         * @return array
         */
        private function options()
        {

            $options = [
                'general'       => [
                    'form'           => GeneralConfigType::class,
                    'template'       => 'general.html.twig',
                    'title'          => 'Configuración General',
                    'ignoreFields'   => ['slider', 'social'],
                    'uploadedFields' => [],
                    'callbacks'      => ['generalData']
                ],
                'business'      => [
                    'form'           => ConfigurationType::class,
                    'template'       => 'business.html.twig',
                    'title'          => 'Configuración de Empresa',
                    'ignoreFields'   => [],
                    'uploadedFields' => ['image','favicon','login_icon','sidebar_icon'],
                    'callbacks'      => ['businessImage']
                ],
      ];

            return $options;
}

现在这是我的疑问,除了指出您必须在键callback中执行的功能之外,我还可以传递{{1}中需要的variables吗? }?我尝试了几种方法,但都没有用。

示例:

之前:

callback

之后:

在此示例中,我分配了'$',但如果只有一个字符串,我可以这样做,我只是在寻找一种方法,将所需的变量传递给回调,并且不再需要。

'callbacks'      => ['generalData']

这段代码将以其他方法执行所有操作:

'callbacks'      => ['generalData' => '$configurationData, $configuration, $form, $request']

3 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么您希望将变量的名称存储在选项数组中,然后在回调函数中使用该变量。

完成此类操作后,发现将变量名称存储为文本并从存储在数组中的名称中省略$会更容易。然后,在检索它时使用变量变量。

无论哪种方式,我认为您都需要在执行方面多一点代码。还有一个循环:

if (!empty($options[ 'callbacks' ])) {
   foreach ($options[ 'callbacks' ] as $callback => $variables) {
       foreach($variables as $variable){ // extra loop to get the variables
           $this->$callback[$$variable];
           // This is where it gets tricky, and depends on how you wish to format.  
           // The variables are currently part of an array, thus the array notation 
           // above.  By using the stored name only, and a variable variable, you 
           // should be able to get to the var you need
      }         
   }           
}

答案 1 :(得分:0)

@jcarlosweb,您需要做的非常简单。简短的答案是可以使用[call_user_func_array()][1]方法完成。

在您的示例上下文中,可以通过以下方式对回调进行重新排列...

'callbacks'      => ['generalData' => [$configurationData, $configuration, $form, $request]

基本上,数组键将是要调用的函数的名称,而对应的数组值将是被接受但回调函数的每个参数的值的数组。这样做很重要,因为您需要在范围内捕获参数的值。而且这将避免使用eval()。

使用回调可以很简单...

$options = options();
foreach ($options['callbacks'] as $callback => $params) {
    $result = call_user_func_array($callback, $params);
    // Do something with $result if necessary
}

答案 2 :(得分:0)

我终于有了紧凑型http://php.net/manual/en/function.compact.php

代码如下:

首先,在选项中选择所需的变量:

'callbacks' => ['businessImage' => ['configurationData', 'configuration', 'form', 'request']]

第二,我用compact来调用变量,但是我不得不在这里使用extract,因为如果没有configurationData变量没有被修改,由于我之前已经引用过,所以我不理解它。

if (!empty($options[ 'callbacks' ])) {
       foreach ($options[ 'callbacks' ] as $callback => $variables) {
           $variables =  compact($variables);
           $this->$callback($variables);
           extract($variables);
      }
 }

已应用并引用了第三次回调:

/**
 * @param array $params
 * @return array $configurationData
 */
private function businessImage(&$params)
{
    extract($params,EXTR_REFS);

    // more code here ......

    $configurationData[ "image" ]   = $originalImageName;
    $configurationData[ "favicon" ] = $originalFaviconName;
    $configurationData[ "login_icon" ] = $originalLoginIconName;
    $configurationData[ "sidebar_icon" ] = $originalSidebarIconName;


    return $configurationData;
}

这正常工作,但是正如我之前说的,如果我已经传递了与您在上一个代码中看到的相同的回调引用的函数,为什么我必须回调函数extract。< / p>