三元运算符中的评估顺序

We *_*age 2 php

我有两个php片段:

function prefix_shortcode_statement_conditional( $atts, $content = null ) {
    return '<li class="some-class">' . $content == null ? '' : $content . '</li>';
}

function prefix_shortcode_statement( $atts, $content = null ) {
    return '<li class="some-class">' . $content . '</li>';
}
Run Code Online (Sandbox Code Playgroud)

第一个片段有一个条件语句返回一个空字符串作为<li>内容,而第二个片段只返回包含的内容<li>.

prefix_shortcode_statement_conditional输出

Lorem Ipsum ...
Run Code Online (Sandbox Code Playgroud)

prefix_shortcode_statement输出

<li class="some-class">
    Lorem Ipsum ... 
</li>
Run Code Online (Sandbox Code Playgroud)

如您所见,只有没有条件语句的函数才能正确生成<li>元素.为什么一个代码段生成代码,而不是另一个?


在括号中包含条件可以解决问题,但无法帮助我理解为什么问题首先出现.

return '<li class="some-class">' . ($content == null ? '' : $content) . '</li>';
Run Code Online (Sandbox Code Playgroud)

据我所知,php应该将结尾解释</li>为条件语句的一部分,但却没有.而不是添加$content . '</li>'到输出,它只是返回$content并在某种程度上(浏览器,wordpress等),第一个<li>从输出的html中删除.

有趣的是,包装$content</li>也无法显示<li>...</li>.

return '<li class="mep-testimonial-li">' . $content == null ? '' : ($content . '</li>');
Run Code Online (Sandbox Code Playgroud)

我希望只有在$contentnull 时才会看到这个问题,因此引用</li>将被省略,格式化将会改变.

Nem*_*ein 6

在PHP中,与其他语言一样,连接的优先级高于比较,因此:

return '<li class="some-class">' . $content == null ? '' : $content . '</li>';
Run Code Online (Sandbox Code Playgroud)

将永远打印$content . '</li>',因为'<li class="some-class">' . $content永远不会是假的ou null.
这可能会导致无效的标记,并且无法在浏览器中正确呈现.

始终用括号括起你的三元组.

return '<li class="some-class">' . ($content == null ? '' : $content) . '</li>';
Run Code Online (Sandbox Code Playgroud)