如何使用“;class_exists”;内部条件if…elseif


how to use "class_exists" conditional inside if...elseif

我有一个if…elseif…else语句链,如下所示:

if (!empty($video_meta)) {
    echo 'foo';
} elseif ( WPCOM_Liveblog::is_liveblog_post() ) {
    echo 'bar';
} elseif (has_tag('featured')) {
    echo 'foobar';
}

第二个elseif语句依赖于激活的特定WordPress插件(liveblog)。如果插件未处于活动状态,则函数将抛出致命错误,因为类WPCOM_Liveblog不存在。

我试着使用像这样的嵌套IF语句

if (has_post_format('video')) {
    echo 'foo';
} elseif (class_exists('WPCOM_Liveblog')) {
    if ( WPCOM_Liveblog::is_liveblog_post() ) {
        echo'bar';
    }
} elseif (has_tag('featured')) {
    echo 'foobar';
}

如果第二个条件为假,那么由于明显的原因,它永远不会进入最终的elseif。class_exists条件的计算结果始终为true,if语句链终止。

我不能使用简单的&&条件,因为我正在寻找一个停用的插件,而第二个条件只会为未知类抛出致命错误。

我也不能改变if…elseif语句的顺序。命令背后有目的。

这感觉像是一个简单的PHP问题,但我被难住了。我是否可以在elseif中嵌套另一个条件?基本上,如果条件的第一部分为真,则执行第二个条件。如果两者都为true,则将true返回给elseif。如果该类不存在,则第二个条件检查永远不会触发。

在PHP中,您的条件是按从左到右的顺序执行的,因此您可以执行以下操作:

elseif (class_exists('WPCOM_Liveblog') && WPCOM_Liveblog::is_liveblog_post()) {
    echo'bar';
}

证明(通过视频):http://ideone.com/fAN2YK

或者,您可以将失败的测试移出循环:

$plugin_loaded = false;
if ( class_exists('WPCOM_Liveblog') ) {
    $plugin_loaded = ( WPCOM_Liveblog::is_liveblog_post() ) ? true : false;
}
if (has_post_format('video')) {
    echo 'foo';
} elseif ($plugin_loaded ) {
    echo 'bar';
} elseif (has_tag('featured')) {
    echo 'foobar';
}