我有两个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>
中包含的内容。
Lorem Ipsum ...
<li class="some-class">
Lorem Ipsum ...
</li>
如您所见,只有没有条件语句的函数才能正确生成<li>
元素。为什么一个代码段会生成代码,而不会生成其他代码?
将括号括起来解决问题,但无法帮助我理解为什么问题首先出现。
return '<li class="some-class">' . ($content == null ? '' : $content) . '</li>';
据我所知,php应该将结束</li>
解释为条件语句的一部分,但却没有。而不是将$content . '</li>'
添加到输出中,而是仅返回$content
并在某个级别(浏览器,wordpress等),从输出的html中删除第一个<li>
。
有趣的是,包裹$content
和</li>
也无法显示<li>...</li>
。
return '<li class="mep-testimonial-li">' . $content == null ? '' : ($content . '</li>');
我希望在$content
为空时才会看到此问题,因此将省略引用的</li>
并且格式化将会发生变化。
答案 0 :(得分:6)
在PHP中,与其他语言一样,concatenation have a higher precedence than comparison,所以:
return '<li class="some-class">' . $content == null ? '' : $content . '</li>';
将始终打印$content . '</li>'
,因为'<li class="some-class">' . $content
永远不会假null
这可能会导致标记无效,并且无法在浏览器中正确呈现。
始终用括号括起你的三元组。
return '<li class="some-class">' . ($content == null ? '' : $content) . '</li>';
答案 1 :(得分:3)
'<li class="some-class">' . $content == null ? '' : $content . '</li>';
这是因为php命令就是这样:
('<li class="some-class">' . $content == null) ? ('') : ($content . '</li>');
因此,您始终将自己的内容添加到“&#39;&#39;字符串,所以它永远不会为null并返回$content . '</li>'
让代码更清晰:
$a = '<li class="some-class">' . $content;
$b = '';
$c = $content . '</li>';
return $a == null? $b : $c;
如您所见,$a
永远不会为空,因此答案始终为$c