Что такое операторы PHP "?" и ":" называется и что они делают?

Каковы ? а также : операторы в PHP?

Например:

(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)

9 ответов

Решение

Это условный оператор.

$x ? $y : $z

означает "если $x верно, тогда используйте $y; иначе использовать $z ".

Он также имеет краткую форму.

$x ?: $z

означает "если $x верно, тогда используйте $x; иначе использовать $z ".

Люди скажут вам, что ?: это "троичный оператор". Это не верно. ?: является троичным оператором, что означает, что он имеет три операнда. Люди начинают думать, что его называют "троичный оператор", потому что это часто единственный троичный оператор, который есть в данном языке.

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

Что такое троичный оператор?

Троичный ? : это сокращение для if а также else, Вот и все. См. "Тернарные операторы" на полпути вниз по этой странице для более официального объяснения.

Начиная с PHP 5.3:

Начиная с PHP 5.3, можно опустить среднюю часть троичного оператора. Выражение expr1?: Expr3 возвращает expr1, если expr1 оценивается как TRUE, и expr3 в противном случае.

Начиная с PHP 7.0

В PHP 7 появился новый оператор Null Coalesce. Это то же самое, что и троичный, но также называется " тройной isset ". Это также позволяет использовать набор цепных троичностей, которые устраняют необходимость проверок isset().

В PHP 5, если вы хотите использовать троичную переменную с потенциально несуществующей переменной, вам придется выполнить isset() в начале троичной инструкции:

$result = isset($nonExistentVariable) ? $nonExistentVariable : ‘default’;

В PHP 7 теперь вы можете сделать это вместо этого:

$result = $nonExistentVariable ?? ‘default’;

Однако оператор Null Coalesce не работает с пустой строкой, так что имейте это в виду. Самое замечательное в этом заключается в том, что вы также можете объединять операторы для нескольких проверок нескольких переменных, обеспечивая своего рода резервное копирование в зависимости от того, существует ли каждая переменная в цепочке:

$user = $userImpersonatingAnotherUser ?? $loggedInUser ?? “Guest”;

В PHP, в системах, где пользователь может войти в систему, администратор нередко может выдать себя за другого пользователя в целях тестирования. В приведенном выше примере, если пользователь не выдает себя за другого пользователя, а также пользователь, вошедший в систему, не существует, он будет гостевым пользователем. Читайте дальше, если вы еще не понимаете этого, чтобы увидеть, что такое троичные и как они используются, а затем вернитесь к этому фрагменту, чтобы увидеть, как новый PHP

Как используются троичные?

Вот как нормальный if Заявление выглядит:

if (isset($_POST['hello']))
{
    $var = 'exists';
}
else
{
    $var = 'error';
}

Давайте сократим это до троичного.

$var = isset($_POST['hello']) ? 'exists' : 'error';
                 ^            ^     ^    ^     |
                 |           then   |   else   |
                 |                  |          |
          if post isset         $var=this   $var=this

Гораздо короче, но, возможно, труднее читать. Они не только используются для установки переменных, таких как $var в предыдущем примере, но вы также можете сделать это с echo и проверить, является ли переменная ложной или нет:

$isWinner = false;

// Outputs 'you lose'
echo ($isWinner) ? 'You win!' : 'You lose';

// Same goes for return
return ($isWinner) ? 'You win!' : 'You lose';

Почему люди их используют?

Я думаю, что троицы сексуальны. Некоторым разработчикам нравится хвастаться, но иногда троицы выглядят просто красиво в вашем коде, особенно в сочетании с другими функциями, такими как последнее короткое эхо PHP 5.4.

<?php 
    $array = array(0 => 'orange', 1 => 'multicoloured'); 
?>

<div>
    <?php foreach ($array as $key => $value) { ?>
        <span><?=($value==='multicoloured')?'nonsense':'pointless'?></span>
    <?php } ?>
</div>

<!-- Outputs:
    <span>
        pointless
    </span>
    <span>
        nonsense
    </span> 
-->

Немного отклоняясь от темы, когда вы находитесь в "представлении / шаблоне" (если вы разделяете свои проблемы с помощью парадигмы MVC), вам нужно как можно меньше логики на стороне сервера. Таким образом, использование троичных и другого сокращенного кода иногда является лучшим способом продвижения вперед. Под "другим сокращенным кодом" я имею в виду:

if ($isWinner) :
    // Show something cool
endif;

Заметьте, мне лично не нравятся такие сокращения, если / endif ерунда

Насколько быстро работает троичный оператор?

Люди любят микрооптимизации. Они просто делают. Поэтому для некоторых важно знать, насколько быстрее такие вещи, как тройные, по сравнению с обычными if / else заявления.

Читая этот пост, различия составляют около 0,5 мс. Это много!

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

Когда не использовать троичные

Ваш код должен быть:

  • Легко читать
  • Легко понять
  • Легко изменить

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

echo ($colour === 'red') ? "Omg we're going to die" :
     ($colour === 'blue' ? "Ah sunshine and daisies" :
     ($colour === 'green' ? "Trees are green"
     : "The bloody colour is orange, isn't it? That was pointless."));

Это было бессмысленно по трем причинам:

  • Смешно длинное тройное вложение
  • Мог бы просто использовать switch заявление
  • Это был оранжевый в первую очередь

Заключение

Троицы действительно просты, и не о чем слишком беспокоиться. Не рассматривайте какие-либо улучшения скорости, это действительно не будет иметь значения. Используйте их, когда они просты и выглядят красиво, и всегда следите за тем, чтобы ваш код был читаем другими в будущем. Если это означает отсутствие троичных, то не используйте троичные.

Это называется троичным оператором. Если первое выражение оценивается как true, HTTPS_SERVER используется, иначе HTTP_SERVER выбран.

Это в основном стенография if заявление, и приведенный выше код также может быть переписан следующим образом:

if ($request_type == 'SSL') {
   HTTPS_SERVER;
}
else {
   HTTP_SERVER;
}

Это иногда называют троичным условным оператором. Тернарный означает, что у него есть три аргумента, как x ? y : z, В основном, это проверяет, если x правда; если да, то ставь y вместо этой операции, в противном случае z,

$hello = $something ? "Yes, it's true" : "No, it's false";

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

variable = condition ? expression1 : expression2;

Это работает следующим образом...

  1. Во-первых, состояние оценивается.
  2. Если условие истинно, тогда выражение1 оценивается. И значение expression1 присваивается переменной.
  3. Если условие ложно, тогда выражение2 оценивается. И значение expression2 присваивается переменной.

Например:

x = (a>b) ? 5 : 9

При этом для x сначала выполняется условие (a>b). Если это условие становится истинным, то x станет значением 5 (т. Е. X =5). Но если условие (a>b) становится ложным, то x достигнет значения 9 (то есть x=9).

Троичный оператор

Иногда условный оператор ? : также называется троичным оператором. Это так, потому что он включает три операнда. Например:

x ? y : z

Здесь x,y и z - три операнда. Если условие x истинно, тогда присваивается значение y, в противном случае присваивается значение z.

Это короткий способ написания if приговоры. Он также используется в других языках, таких как Java, JavaScript и другие.

Ваш код,

$protocol = $request_type == 'SSL' ? HTTPS_SERVER : HTTP_SERVER;

можно написать так:

if ($request_type == 'SSL')
    $protocol = HTTPS_SERVER;
else
    $protocol = HTTP_SERVER;

Это одна строка, если заявление:

condition ? true : false

В обычном выражении if в вашем случае это будет:

if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;

Это работает как оператор if, это очень просто и легко, когда вы к нему привыкнете. (условия_выражения)? what_to_do_if_true: what_to_do_if_false.

Это в основном причудливый способ написания if-else заявление. Некоторые говорят, что читать легче, другие - нет.

Тернарный оператор в Википедии

Как говорит Джон Т., он называется троичным оператором и по сути является сокращенной версией оператора if /else. Ваш пример, как полный оператор if /else, будет читать;

if($request_type == 'SSL')
{
    HTTPS_SERVER;
}
else
{
    HTTP_SERVER;
}
Другие вопросы по тегам