Web

Как использовать тернарный оператор (?:) в PHP как сокращение «if/else»

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

Рабочий код с использованием оператора if:

if (!empty($address['street2'])) echo $address['street2'].'<br />';

 

Нерабочий код с использованием тернарного оператора:

$test = (empty($address['street2'])) ? 'Да <br />' : 'Нет <br />';

// Также проверено следующее 

(empty($address['street2'])) ? 'Да <br />' : 'Нет <br />';

// Или

echo (empty($storeData['street2'])) ? 'Да <br />' : 'Нет <br />';

 

Ответ 1

 (condition) ? /* значение, которое возвращается, если условие истинно */ 

            : /* значение, которое возвращается, если условие ложно */ ;

синтаксис не является сокращенным оператором if ( «называется условным оператором), потому что вы не можете выполнить код таким же образом, как если бы вы сделали это:

if (condition) {

    /* условие истинно, сделайте что-то вроде echo */

else {

    /* условие ложно, сделайте что-нибудь еще */

}

 

В вашем примере вы выполняете инструкцию echo, когда $address не пусто. Вы не можете сделать то же самое с условным оператором. Однако то, что вы можете сделать, является echo результатом условного оператора:

 

echo empty($address['street2']) ? " Улица2 пуста!" : $address['street2'];

 

и эта конструкция отобразит «Улица2 пуста!» если она пуста, в противном случае будет отображаться адрес street2.

 

 

Ответ 2

Основное истинное/ложное объявление:

$is_admin = ($user['permissions'] == 'admin' ? true : false);

 

Условное приветственное сообщение:

echo 'Добро пожаловать '.($user['is_logged_in'] ? $user['first_name'] : 'Гость').'!';

 

Сообщение с условными элементами:

echo 'Ваша корзина содержит '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

 

Ответ 3

Быстрый и короткий путь:

echo $address['street2'] ? : "Нет";

 

Вот несколько интересных примеров с одним или несколькими различными условиями:

$color = "blue";

// Условие #1 Показать цвет без указания переменной 

echo $color ? : "Undefined";

echo "<br>";

// Условие #2

echo $color ? $color : "Undefined";

echo "<br>";

// Условие #3

echo ($color) ? $color : "Undefined";

echo "<br>";

// Условие #4

echo ($color == "blue") ? $color : "Undefined";

echo "<br>";

// Условие #5

echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));

echo "<br>";

// Условие #6

echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));

echo "<br>";

// Условие #7

echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";

echo "<br>";

 

Ответ 4

Обратите внимание, что при использовании вложенных условных операторов вы можете использовать круглые скобки, чтобы избежать возможных проблем!

Похоже, PHP работает не так, как хотя бы код на Javascript или C#.

$score = 15;

$age = 5;

// Следующий код вернет "Exceptional"

echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));

// А этот код вернет "Horrible"

echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');

 

Один и тот же код в Javascript и C# в обоих случаях возвращает «Exceptional».

Во втором случае PHP делает следующее:

  1. Есть $score > 10? да.

  2. Есть $age > 10? нет, поэтому текущий $age > 10 ? 'Average' : 'Exceptional' возвращает «Exceptional».

  3. Затем, вместо того, чтобы просто останавливать весь оператор и возвращать «Exceptional», он продолжает вычислять следующий оператор.

  4. Становится следующий оператор, 'Exceptional'? 'Horrible': 'Average', который возвращает «Horrible», поскольку «Exceptional» является правдой.

Рекомендуется избегать «складывания» тернарных выражений. Поведение PHP при использовании более чем одного тернарного оператора в одном операторе не очевидно.

 

Ответ 5

Я думаю, вам, вероятно, не следует использовать тернарный оператор в php. Рассмотрим следующий пример:

<?php

 function f1($n) {

    var_dump("первая функция");

    return $n == 1;

}

 

function f2($n) {

    var_dump("вторая функция");

    return $n == 2;

}

 $foo = 1;

$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";

print($a);

Как вы думаете, что переменная $a будет содержать? (подсказка: dos) И она останется такой же, даже если переменной $foo будет присвоено значение 2.

Чтобы было лучше понятно, вы должны либо отказаться от использования этого оператора, либо заключить правую часть в круглые скобки следующим образом:

$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");

 

 Ответ 6

Тернарный оператор – это в основном сокращение для оператора if/else. Мы можем использовать его, чтобы сократить количество строк кода и повысить удобочитаемость.

Ваш код мне кажется чище. Но мы можем добавить более чистый способ следующим образом:

$test = (empty($address['street2'])) ? 'Да <br />' : 'Нет <br />';

 

Другой путь:

$test = ((empty($address['street2'])) ? 'Да <br />' : 'Нет <br />');

Примечание. Я добавил скобки ко всему выражению, чтобы оно было чище. Обычно я делал это для повышения читабельности. С PHP7 мы можем использовать Null Coalescing Operator/php 7 ?? оператор для лучшего подхода. Но для вашего случая это не подходит.

 

Схожие статьи

Сертификат SSL Let’s encrypt. Что это такое и где используется?
Web

Сертификат SSL Let’s encrypt. Что это такое и где используется?

Базовые знания HTML и CSS для начинающих: с какой стороны подойти к изучению
Web

Базовые знания HTML и CSS для начинающих: с какой стороны подойти к изучению

Web

PhpBB: как установить, какие требования существуют для установки

Web

Как получить содержимое POST на php?

×