php中的动态函数名称

时间:2013-02-21 14:35:32

标签: php function dynamic wordpress

我想在WordPress中简化“自定义帖子类型”的创建,因为通过相同的脚本并一遍又一遍地手动更改所有自定义帖子类型名称实例非常繁琐。

通过创建包含CPT名称的变量并在需要的任何地方使用它来实现它非常简单。这样,我所要做的就是在脚本的开头声明变量,并且应该处理其余部分。

唯一的问题是,为了使它工作,我还需要在脚本内的每个函数前面加上CPT名称的前缀,并且似乎在PHP中使用函数名中的变量并不容易甚至推荐。

那么我怎么能解决这个问题?

以下示例说明:

$prefix = 'news';

function news_custom_type_init()
{
    global $prefix;

    register_post_type($prefix, array(
    'labels' => array(
          'name' => $prefix,
          'singular_label' => $prefix,
          'add_new' => 'Add',
          ...
        ));

        register_taxonomy_for_object_type( 'category', $prefix );
}
add_action('init', $prefix.'_custom_type_init');

这几乎没问题,如果只是我可以动态重命名函数,以便不必在它前面写“新闻”这个词,而是使用“$ prefix”代替,这可以标准化。

这本来可以很好但是不起作用:

$prefix = 'news';

$functionName= $prefix."_custom_type_init";

function $functionName()
{
    global $prefix;

    register_post_type($prefix, array(
    'labels' => array(
          'name' => $prefix,
          'singular_label' => $prefix,
          'add_new' => 'Add',
          ...
        ));

        register_taxonomy_for_object_type( 'category', $prefix );
}
add_action('init', $prefix.'_custom_type_init');

手动命名函数有点失败了我尝试的最初目的(特别是当脚本嵌入了这样的几十个函数时)。

最好的方法是什么?

PS:我用google搜索了“stackoverflowed”,但未发现任何符合我需求的工作解决方案,也没有生成WordPress错误消息。

谢谢。

7 个答案:

答案 0 :(得分:8)

很简单,这是一个类似剪切形式的项目:

$function = $prefix . '_custom_type_init';
if(function_exists($function)) {
  $function();
}

答案 1 :(得分:6)

这是一个旧线程,但只是使用匿名函数:

add_action('init', function() use($args) {
    //...
});

然后没有必要声明这么多功能。

答案 2 :(得分:2)

编辑(2017-04):匿名函数(正确实现)是要走的路,请参阅David Vielhuber的回答。

这个答案是不明智的,任何涉及代码作为字符串的方法都是如此,因为这会引发(除此之外)连接。


我不确定是否可以使用,或者它是否有帮助,但php允许您创建“匿名”功能:

function generateFunction ($prefix) {
    $funcname = create_function(
        '/* comma separated args here */', 
        '/* insert code as string here, using $prefix as you please */'
    );
    return $funcname;
}

$func= generateFunction ("news_custom_type_init");
$func(); // runs generated function

我假设add_action只调用你传递的任何函数。

http://php.net/manual/en/function.create-function.php

注意:create_function不会返回具有所需名称的函数,但函数的内容将在您的控制之下,并且函数的真实名称并不重要。

答案 3 :(得分:2)

我认为你可以使用

runkit_function_add

http://php.net/manual/pl/function.runkit-function-add.php

另一种可用的方法是使用eval()

答案 4 :(得分:0)

这篇文章很老,但是PHP 7可以解决这个问题。

尝试:

$prefix = 'news';

$functionName = $prefix . "_custom_type_init";

${$functionName} = function() use ($prefix) {

    register_post_type($prefix, array(
        'labels' => array(
            'name' => $prefix,
            'singular_label' => $prefix,
            'add_new' => 'Add'
        )
    );

    register_taxonomy_for_object_type( 'category', $prefix );
};

add_action('init', '$' . $functionName);

我认为它应该适用于WordPress。

答案 5 :(得分:0)

我不确定以上内容是否能真正回答有关动态创建自定义帖子类型的问题。但这对我有用:

$languages = ("English", "Spanish", "French");

foreach($languages as $language):

    $example = function () use ($language) {

        $labels = array(
                'name' => __( $language . ' Posts' ),
                'singular_name' => __( $language . ' Post' )
        );

        $args = array(
   
            'labels'              => $labels,
            'hierarchical'        => false,
            'public'              => true,
            'show_ui'             => true,
            'show_in_menu'        => true,
            'show_in_nav_menus'   => true,
            'show_in_admin_bar'   => true,
            'menu_position'       => 5,
            "rewrite" => array( "slug" => $language . "_posts", "with_front" => true ),
            'capability_type'     => 'page',
         );
        register_post_type( $language . "_posts", $args );  

    };
    add_action( 'init', $example, 0 );

endforeach;

答案 6 :(得分:0)

在 PHP 中命名为 variable functions 的动态函数

https://www.php.net/manual/en/functions.variable-functions.php

举例

$functionName = function () {
    global $prefix;

    register_post_type($prefix, array(
    'labels' => array(
          'name' => $prefix,
          'singular_label' => $prefix,
          'add_new' => 'Add',
          ...
        ));

        register_taxonomy_for_object_type( 'category', $prefix );
}

您可以通过键入 $functionName()

来调用它