> For the complete documentation index, see [llms.txt](https://overfinch.gitbook.io/cheatsheet/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overfinch.gitbook.io/cheatsheet/php/ternarnye-operatory.md).

# Тернарные операторы

### `?:` Условный тернарный оператор

Выражение `(expr1) ? (expr2) : (expr3)` интерпретируется как expr2, если expr1 имеет значение **`true`**, или как expr3, если expr1 имеет значение **`false`**.

```php
$result = (2 > 1) ? 'если true' : 'если false';

//аналогично этому
if(2 > 1) {
    $result = 'если true';
}else{
    $result = 'если false';
}
```

Кророткий тернарный оператор `(expr1) ?: (expr2)`

```php
$result = $var ?: '';

//аналогично этому
if($var) {
    $result = $var;
}else{
    $result = '';
}
```

Цепочка коротких тернарных операторов (`?:`) <mark style="color:green;">вернёт первый аргумент, который оценивается как не ложное значение</mark>.

```php
$res = 0 ?: 1 ?: 2 ?: 3; //1
$res = 0 ?: 0 ?: 2 ?: 3; //2
$res = 0 ?: 0 ?: 0 ?: 3; //3
```

### `??` Оператор объединения с null

Выражение `(expr1) ?? (expr2)` вычисляется так: `expr2`, если `expr1` равен `null` и `expr1` в противном случае.\
То же самое что и ?: но <mark style="color:green;">возвращает первый результат который не null</mark>. То есть вернёт даже `false`, главное что бы не `null`.

```php
$res = 0 ?? 1 ?? 2 ?? 3; //0
$res = null ?? null ?? 2 ?? 3; //2
$res = false ?? 1 ?? 2 ?? 3; //false
```

Удобно использовать для определения дефолтного значения, если первый операнд равен null.

```php
// если $_POST['action'] не равен null то вернёт его, 
// а если равен null то вернёт 'default'
$action = $_POST['action'] ?? 'default';

// Пример выше аналогичен следующему коду
if (isset($_POST['action'])) {
    $action = $_POST['action'];
} else {
    $action = 'default';
}
```

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

```php
// если таких эллементов нету в массиве $json, то вернёт "default"
// и не вызовет ошибку про то что нет таких ключей в массиве
$data = $json["thumbnail"]["source"] ?? "default";


// Пример выше аналогичен следующему коду
if (isset($json["thumbnail"]["source"])){
    $data = $json["thumbnail"]["source"];
}else{
    $data = "default";
}
```
