Php троичное заявление - PullRequest
       12

Php троичное заявление

1 голос
/ 02 декабря 2009

Привет, я недавно просматривал класс paginator для корзины покупок, пытаясь понять их код, чтобы я мог создать свой собственный paginator, когда натолкнулся на следующую строку кода. Это напоминает троичное утверждение, но написано так, как я никогда раньше не видел. Я хотел бы Google, но я не знаю, что 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>';

Просто дайте мне знать, достаточно ли этого кода для продолжения Спасибо Andrew

Ответы [ 3 ]

2 голосов
/ 02 декабря 2009

Хорошо ... Это просто обычный условный оператор (ну, 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 голос
/ 02 декабря 2009

Это называется условным оператором, и я бы посчитал это злоупотреблением им. Условные операторы могут быть полезны для сокращения коротких конструкций 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>';
1 голос
/ 02 декабря 2009
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>'

То же самое относится и к другим третичным операторам, используемым в вашем коде.

...