Тернарная условная операция

Тернарная условная операция или как часто любят говорить краткая запись if может принести много беды, если не понимать некоторых тонкостей.

Синтаксис следующий

 

Синтаксис:

expression ? true_value : false_value
Выполнение этой инструкции начинается с операнда expression. Если значение выражения expression истинно (true), то возвращается значение выражения true_value, иначе возвращается false_value.
Вроде все ясно.
Например, если в $id нам передается номер статьи, то используем его, если нет, то перевод на первую новость.
Как это будет выглядеть
$id = '1212';
$id = empty($id) ? $id : 1;

Однако все не так просто. Что если передадут в id буквы?

$id = 'asdas';
$id = empty($id) ? $id : 1;
//  выведет asdas

Заюзаем проверку на число

$id = is_numeric($id) ? $id : 1;

Но и тут, можно передать отрицательное число, что не есть хорошо, или 001, что может привести к проблемам в некоторых случаях, тогда запишем  так

$id = is_numeric($id)  && $id>0  ? (int)$id : 1;

 

Но мы можем развернуть эту схему в классический if else, т.е. сделать записать в одном из операндов выражение.

 

<?php

$id = 'sfg';
is_numeric($id) && $id>0  ? $id=(int)$id : $id=1;
echo $id;

Идентично

if (is_numeric($id) && $id>0){
    $id=(int)$id;
}else{
    $id=1;
}

 

 

Путаница для новичков возникает при первом просмотре примерно такого выражения, когда, вроде как переменной идет присвоение какого то выражения, а на выходе получаем совсем другое.

<?php

$id = '21';
$id = (is_numeric($id) && $id>0) && $id!=1  ? (int)$id : 1;

echo $id;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>