我有两个 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>';
}
第一个片段有一个条件语句返回一个空字符串作为 <li>
内容,而第二个仅返回包裹在 <li>
中的内容.
prefix_shortcode_statement_conditional 输出
Lorem Ipsum ...
prefix_shortcode_statement 输出
<li class="some-class">
Lorem Ipsum ...
</li>
如您所见,只有没有条件语句的函数才能正确生成 <li>
元素。为什么一个片段会生成代码,而另一个片段不会?
将条件括在括号中可以解决问题,但无法帮助我理解问题最初出现的原因。
return '<li class="some-class">' . ($content == null ? '' : $content) . '</li>';
据我所知,php 应该解释结尾 </li>
作为条件语句的一部分,但失败了。而不是添加 $content . '</li>'
对于输出,它只是返回 $content
在某种程度上(浏览器、wordpress 等),第一个 <li>
从输出的 html 中删除。
有趣的是,包装 $content
和 </li>
也无法显示 <li>...</li>
.
return '<li class="mep-testimonial-li">' . $content == null ? '' : ($content . '</li>');
我希望只有在 $content
时才会看到这个问题为空,因此引用的 </li>
会被省略并且格式会改变。
最佳答案
在 PHP 中,与在其他语言中一样,concatenation have a higher precedence than comparison ,所以:
return '<li class="some-class">' . $content == null ? '' : $content . '</li>';
将始终打印 $content . '</li>'
, 自 '<li class="some-class">' . $content
永远不会是 falsy 或 null。
这可能会导致标记无效,并且无法在浏览器中正确呈现。
始终将三元组括在括号中。
return '<li class="some-class">' . ($content == null ? '' : $content) . '</li>';
关于php - 三元运算符的评估顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40089827/