首页 > 解决方案 > 如何简化这个复合 php if/else 语句

问题描述

我有三种可能的方法可以设置给定页面的“英雄”部分的高度,其中有一个应该选择哪个变量的优先级。

如果变量是在页面级别设置的,那么就使用它。

如果是博客存档或博客文章,请使用博客选项设置。

如果它们不可用,请使用主题设置。

如果它们不可用,请使用默认值。

如果它不是博客,则使用可用的主题设置,否则,使用硬编码的默认设置。

到目前为止,我是这样写的:

//// CUSTOMIZER OPTIONS
    $heroHeightDefault = 'header_md';
    $heroHeightTheme = get_theme_mod( 'hero_header_height', 0 );
    $heroHeightBlog = get_field($sepPrefix . '_override_height', 'options');
    $heroHeightPage = get_field($sepPrefix . '_override_height');
    
    if(empty($heroHeightTheme) && empty($heroHeightBlog) && empty($heroHeightPage)){
        $heroHeight = $heroHeightDefault; // No settings - choose default (this is my safety in case my logic below is flawed)
    } elseif(!empty($heroHeightPage)){
        $heroHeight = $heroHeightPage; // if the page settings are NOT empty choose the page settings
    } elseif($isBlogPage) { // if the page settings are empty Check to see if it's a blog page
        if(!empty($heroHeightBlog)){
            $heroHeight = $heroHeightBlog; // If the blog options are set, use the blog options
        } elseif(!empty($heroHeightTheme)){
            $heroHeight = $heroHeightTheme; // if the blog options were not set, and the theme options are not set, use the default
        } else {
            $heroHeight = $heroHeightDefault; // use the default if no settings for the blog page
        }
    } elseif(!empty($heroHeightTheme)) {
        $heroHeight = $heroHeightTheme; // If nothing else has been set, check the theme settings and use that
    } else {
        $heroHeight = $heroHeightDefault; // Otherwise, use the default.
    }

这行得通,它可以正常工作,可以做我想做的事,但我不确定是否有更好、更有效的方法来做同样的事情——任何建议都将不胜感激!

标签: php

解决方案


这要短得多,应该会产生相同的结果。它的可读性有点差...

if(trim($heroHeightTheme.$heroHeightBlog.$heroHeightPage) === '') $heroHeight = $heroHeightDefault; 
elseif(!empty($heroHeightPage)) $heroHeight = $heroHeightPage; 
elseif($isBlogPage)  $heroHeight = !empty($heroHeightBlog) ? $heroHeightBlog : (!empty($heroHeightTheme) ? $heroHeightTheme : $heroHeightDefault); 
else $heroHeight = !empty($heroHeightTheme) ? $heroHeightTheme : $heroHeightDefault; 

更容易破译的是从逻辑中分离出条件

 $no_settings = trim($heroHeightTheme.$heroHeightBlog.$heroHeightPage) === '' ;
 $blogHeight = !empty($heroHeightBlog) ? $heroHeightBlog : (!empty($heroHeightTheme) ? $heroHeightTheme : $heroHeightDefault);
 $themeHeight = !empty($heroHeightTheme) ? $heroHeightTheme : $heroHeightDefault;

 if($no_settings) $heroHeight = $heroHeightDefault; 
 elseif(!empty($heroHeightPage)) $heroHeight = $heroHeightPage; 
 elseif($isBlogPage) $heroHeight = $blogHeight; 
 else $heroHeight = $themeHeight; 

推荐阅读