Php三元声明

时间:2009-12-02 10:52:04

标签: php conditional-operator

您好我最近正在查看购物车分页器类,试图了解他们的代码,以便在我遇到以下代码行时构建自己的分页器。它类似于三元语句,但是以我以前从未见过的方式编写。我会google它,但我不知道该怎么去谷歌。有人可以请告诉我它是如何工作的以及它的名称所以我可以搜索它并了解更多信息。

    return ($output ? '<div class="' . $this->style_links . '">' . $output . '</div>' : '') 
. '<div class="' . $this->style_results . '">' . sprintf($this->text, ($total) ? (($page - 1) * $limit) + 1 : 0, ((($page - 1) * $limit) > ($total - $limit)) ? $total : ((($page - 1) * $limit) + $limit), $total, $num_pages) . '</div>';

如果这是足够的代码,请告诉我 谢谢 安德鲁

3 个答案:

答案 0 :(得分:2)

很好......它只是一个常规的条件运算符(好吧,其中3个,连同一些连接)。

如果你重新格式化它,它会更清楚:

$output = $output ? '<div class="' . $this->style_links . '">' . $output . '</div>' : '';

$min = $total ? (($page - 1) * $limit) + 1 : 0;
$max = (($page - 1) * $limit) > ($total - $limit) ? $total : ((($page - 1) * $limit) + $limit);

$output .= '<div class="' . $this->style_results . '">'
    . sprintf($this->text, $min, $max, $total, $num_pages)
    . '</div>';

return $output;

答案 1 :(得分:1)

expression ? runs if true : runs if false;

更多信息

 http://www.johnhok.com/2008/02/23/php-tip-tertiary-operator/

在你的情况下:

$output ? '<div class="' . $this->style_links . '">' . $output . '</div>' : ''

如果$ output变量不为空,则返回以下,否则返回空''字符串。

<div class="' . $this->style_links . '">' . $output . '</div>'

您的代码中使用的其他第三级运算符也是如此。

答案 2 :(得分:1)

它被称为条件运算符,我认为这是滥用它。条件运算符可用于将简短的if-else结构减少到一个语句中,而不会影响代码的可读性。

if(a == b)
    c = d;
else
    c = e;
//can be written as:
c = a == b ? d : e;

给定的代码可以写成:

return ($output ? 
            '<div class="' . $this->style_links . '">' . $output . '</div>'
         : '') . 
    '<div class="' . $this->style_results . '">' . 
    sprintf($this->text, 
        ($total) ? 
            (($page - 1) * $limit) + 1 
          : 0, 
        ((($page - 1) * $limit) > ($total - $limit)) ? 
            $total 
          : ((($page - 1) * $limit) + $limit), 
        $total, $num_pages) . '</div>';

相当于:

if($output)
    $str = '<div class="' . $this->style_links . '">' . $output . '</div>';
else
    $str = '';

$str .= '<div class="' . $this->style_results . '">';

if($total)
    $first = (($page - 1) * $limit) + 1;
else
    $first = 0;

if((($page - 1) * $limit) > ($total - $limit))
    $second = $total;
else
    $second = ((($page - 1) * $limit) + $limit);

$str .= sprintf($this->text, $first, $second, $total, $num_pages);
$str .= '</div>';