2009-12-02 6 views
1

Привет, я недавно просмотрел класс paginator для корзины покупок, пытаясь понять их код, чтобы я мог создать свой собственный paginator, когда натолкнулся на следующую строку кода. Это похоже на тройное утверждение, но написано так, как я никогда раньше не видел. Я бы это сделал, но я не знал бы, что делать в Google. Может кто-нибудь, пожалуйста, скажите мне, что это такое, как это работает и что он называется, поэтому я могу выполнить поиск и узнать больше.Php trernary statement

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>'; 

Просто дайте мне знать, если это достаточно код, чтобы перейти на Спасибо Эндрю

+1

Интересно, кто будет поддерживать эти overabused условных операторов оператора. – Amarghosh

+1

О, мои глаза! Мои глаза! –

+0

Не я благодарен – andrew

ответ

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>'; 
+0

, за исключением случаев, когда это всего лишь $ a = $ b? c: d; который, по моему мнению, был странным, потому что я не понимал, что вы можете протестировать переменную для пустого без использования пустого ($ var) – andrew

+0

'if ($ output)' оценивается как 'true', если' $ output' определен где-то раньше и не является пустой строкой. Пустые строки являются «ложными». – Amarghosh

+0

ahhh ok, что имеет смысл. Благодаря – andrew

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>' 

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

+0

ok, поэтому, если вы просто поместите переменную, которую вы говорите, эта переменная пустая. Я не знал, что вы можете использовать их таким образом – andrew

+0

yes $ output? такой же, как if ($ output! = '') – Sarfraz

+0

Вы имеете в виду ($ output == '')? т.е. выход не равен нулю? – andrew

2

Nice ... Это просто обычный условный оператор (ну, 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; 
+0

Хорошо, я не понимаю первую строку. Что означает знак вопроса, там я думал, что троичные операторы пошли так: $ string = (condtion)? Do if true: do if false; где это условие? или выводит условие, как это может быть условие? – andrew

+0

Я раньше их не видел, как это работает – andrew

+0

Простая переменная также является выражением. Это возвращает true, если значение переменной «равно» равно true, поэтому оно не должно быть «0», «false», «array()» или пустая строка ... – Franz