三元运算符

时间:2016-10-17 15:05:35

标签: 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>';
}

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

prefix_shortcode_statement_conditional output

Lorem Ipsum ...

prefix_shortcode_statement output

<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>并且格式化将会发生变化。

2 个答案:

答案 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