变量函数名称

时间:2014-06-12 12:54:07

标签: php function loops

我有以下列表...“ch”,“uk”和“eu”...此列表将动态添加。

我需要创建一个循环,为列表中的每个项创建函数。这些函数中的每一个都具有完全相同的代码。 (参见下面的完整功能)。唯一不同的是函数名称。下面你会看到函数名称是“filterthis_uk” - 对于列表中的每个项目,函数名称应为“filterthis_ch”,“filterthis_eu”等...

function filterthis_uk($form){

foreach( $form['fields'] as &$field ) {

$funcNameCode = substr(__FUNCTION__, strpos(__FUNCTION__, "_") + 1);

if ( false === strpos( $field['cssClass'], __FUNCTION__ ) || ! rgar( $field, 'allowsPrepopulate' ) )
continue;


$args = array( 'post_type' => 'product', 'posts_per_page' => -1, 'product_cat' => 'courses', 'meta_key' => 'course_start_date', 'meta_query' => array(
    array(
        'key'       => 'course_start_date',
        'compare'   => '>',
        'value'     => $today,
    ),
     array(
        'key'       => 'course_end_date',
        'compare'   => '>',
        'value'     => $today,
    ),
    array(
        'key'       => 'course_location',
        'value'     => $funcNameCode,
    )
),  'orderby' => 'meta_value_num', 'order' => 'ASC' );



$query = new WP_Query( $args );
$field['choices'] = array();
if ( empty( $query->posts ) ) {
// Empty field if needed
$field['choices'] = array( array( 'text' => 'No Courses Found', 'value' => '' ) );
}
else {
foreach( $query->posts as $post )
$field['choices'][] = array( 'text' => $post->post_title . $funcNameCode, 'value' => $post->ID );
}

// Add Other Choice
$field['enableOtherChoice'] = 1;

break;
}
return $form;
}

必须有一种方法可以完成,因此不需要重复功能代码。唯一改变的是函数名中“_”后面的两个字母。之后是列表中项目的值,即“uk”,“ch”等......

3 个答案:

答案 0 :(得分:1)

你应该让国家成为一个参数;这是什么参数。

但是如果你觉得需要一个基于函数的API,为什么不创建一个类并使用__callstatic函数呢?它会更容易,它会更清洁,并且它不会挤占你的命名空间;

class filterCountry
{
  static $countries = ['uk', 'eu', 'ch'];
  static function __callstatic ($country, $args) 
  {
    if (in_array($country, self::$countries))
      /* logic. Note that $form will be under $args[0] */
    else
      /* graceful error handling */
  }
}

您最终的API看起来像......

filterCountry::uk($form);
filterCountry::eu($form);
filterCountry::ch($form);

编辑:添加错误处理。函数方法的问题在于,如果函数不存在,它将终止整个脚本;使用类和__callstatic可以提供优雅的错误处理,只需根据需要扩展国家/地区 - 或者更好 - 您可以从其他来源(如数据库)中提取这些国家/地区。

编辑2:切换到PHP5数组语法。清洁器。

当你觉得自己开始需要聪明的时候。使用你的代码,这是做出错误决定的标志,会让你陷入困境。

答案 1 :(得分:0)

您可以使用Variable functions

$function = 'filterthis_'. $lang;
$function($form);

如果您可以更改此功能,您还可以更改其名称并将lang作为参数发送

function filterthis($lang, $form) { ... }

答案 2 :(得分:0)

你所问的是没有多大意义(为什么有许多相同的函数??)但是可以使用变量和闭包:

$list = ['uk','ch','eu'];

foreach($list as $item){

    $filterthis_$item = function(){
        return 'hello';
    }
}

echo $filterthis_uk();
echo $filterthis_ch();
echo $filterthis_eu();