Что такое операторы 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 оценивается. И значение expression1 присваивается переменной.
- Если условие ложно, тогда выражение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;
}