重构条件 PHP


Refactoring Conditional PHP

我想知道是否有另一种方法可以重构我的条件 if/else 语句。我觉得我在一遍又一遍地重复同样的事情,

这是一个片段(请记住比这更长,但它遵循相同的原理)我可以做一个 switch 语句,但它不会减少总代码量。

我只是想获得此代码投入生产的最佳方法的第二意见。同样重要的是要提到我正在比较的语句$screen->id;如果用户选中该复选框,则最有可能动态生成,但这超出了问题的范围。

    //check admin screen
    $screen = get_current_screen();
    if ( $screen->id === 'topic') {
        $in['content_css'] = get_template_directory_uri() . "/build/styles/tiny-mce-editor.css";
        $in['block_formats'] = $topics_blocks;
        return $in;
    }
    elseif ( $screen->id === 'provider-jobs')  {
        $in['content_css'] = get_template_directory_uri() . "/build/styles/tiny-mce-editor.css";
        $in['block_formats'] = $providers_blocks;
        return $in;
    }
    //for all the page options
    else {
        $in['block_formats'] = $global_blocks;
        return $in;
    }
}

谢谢!任何指导都值得赞赏。

更新!这是重构的代码,更干净一点!并完成,以便整个上下文显示。

//check admin screen
$screen = get_current_screen();
//global ones
$in['block_formats'] = $global_blocks;
$in['toolbar1'] = $global_toolbar;
if ( $screen->id === 'topic') {
    $in['block_formats'] = $topics_blocks;
    $in['toolbar1'] = $topics_toolbar;
} elseif ( $screen->id === 'forum')  {
    $in['block_formats'] = $forums_blocks;
    $in['toolbar1'] = $forums_toolbar;
} elseif ( $screen->id === 'post')  {
    $in['block_formats'] = $blogs_blocks;
    $in['toolbar1'] = $blogs_toolbar;
} elseif ( $screen->id === 'jobs')  {
    $in['block_formats'] = $jobs_blocks;
    $in['toolbar1'] = $jobs_toolbar;
}
elseif ( $screen->id === 'provider-jobs')  {
    $in['block_formats'] = $providers_blocks;
    $in['toolbar1'] = $providers_toolbar;
}
return $in;

您可以注册所有已知选项/块的键/值对。所以你的代码变得直接简化,就像这样:

  $options = [
    'topic'         => $topics_blocks,
    'provider_jobs' => $providers_blocks,
    // ...
  ];
  //check admin screen
  $screen = get_current_screen();
  if (array_key_exists($screen->id, $options) {
    $in['content_css'] = get_template_directory_uri() . "/build/styles/tiny-mce-editor.css";
    $in['block_formats'] = $options[$screen->id];
  } else {
    $in['block_formats'] = $global_blocks;
  }
  return $in;

编辑,适用于 OP 的第二个版本

这里的问题看起来有点不同,所以这是另一个解决方案:

$options = [
  'topic' => 'topics',
  'forum' => 'forums',
  'post'  => 'blogs',
  'jobs'  => 'jobs',
  'provider_jobs' => 'providers',
];
//check admin screen
$screen = get_current_screen();
//global ones
$in['block_formats'] = $global_blocks;
$in['toolbar1'] = $global_toolbar;
// variable ones
if (array_key_exists($screen->id, $options) {
  $in['block_formats'] = ${$options[$screen->id] . '_blocks'};
  $in['toolbar1'] = $options[$screen->id] . '_toolbar'};
}
return $in;