动态创建函数名称(动态) - PHP

时间:2015-11-10 17:07:45

标签: php function callback hook

以下是我正在使用的代码。

function my_tab( $tabs ) {

    // the following array will be created dynamically
    $colors = array("red", "white", "blue");

    foreach ($colors as $value) {
        $tabs[$value] = array(
            'name' => $value
        );  

        // start creating functions
        function content_for_[$value]() {
            echo "this is the " .$value. " tab";
        }
        // stop creating functions

        add_action('content_for_'.$value, 'content_for_'.$value);
    }
    return $tabs;

}

如您所见,我有一个动态创建的数组。对于每个color,我需要创建一个function。这些函数绑定到hooks,函数名称必须exist。到目前为止,我在过去6小时内尝试的所有内容都会导致类似以下错误:

  

" call_user_func_array()期望参数1是有效的回调,   功能' content_for_green'未找到或无效的功能名称"

2 个答案:

答案 0 :(得分:2)

如果您使用的是PHP> = 5.3,则可以使用anonymous functions,例如

add_action( 'content_for_' . $value, function() use ( $value ) {
      echo "this is the " . $value . " tab";
   }
);

使用use关键字允许匿名函数从当前范围捕获变量(例如,在您的情况下为$value)。

答案 1 :(得分:1)

你肯定不想这样做,这是可怕的做法。使用闭包as vitozev advises,明显不那么难看,但仍然难以维持伏都教魔法。

相反,只需在回调中添加一个参数,例如通过扩展现有的参数数组:

function content_for_color_callback($args) {
    echo 'this is the ' . $args['color'] . ' tab';
}

只需注册钩子:

add_action('content_for_color', 'content_for_color_callback');

...并将color作为标准参数传递:

// do not do this
do_action("content_for_{$nav}", $args);

// do this instead
$args['color'] = $nav;
do_action('content_for_color', $args);

这种方法的众多优点之一是您可以减少出现模糊错误的空间。例如,假设某人感觉像是在调用不存在的content_for_bazinga()函数。用你的方法,你会得到一个模糊的

  

调用未定义的函数content_for_bazinga()

与:比较:

function content_for_color_callback($args) {
    $color = $args['color'];
    if( !colorIsValid($color)) {
        throw new Exception("There is no such tab: $color");
    }
    echo "This is the $color tab";
}