Что такое операторы ?
и :
в PHP?
Например:
(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
Что такое операторы ?
и :
в PHP?
Например:
(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
Это условный оператор.
$x ? $y : $z
означает «если $x
истинно, то используйте $y
; в противном случае используйте $z
».
У него также есть краткая форма.
$x ?: $z
означает «если $x
истинно, то используйте $x
; в противном случае используйте $z
».
Люди скажут вам, что ?:
- это «тернарный оператор». Это не правильно. ?:
является тернарным оператором, что означает, что он имеет три операнда. Люди приходят к выводу, что его имя - «тернарный оператор», потому что часто это единственный тернарный оператор, имеющийся в данном языке.
?:
хорошо известен; этот термин встречается гораздо чаще, чем условный оператор.
- person NikiC; 05.05.2011
AND
и OR
, которые проверяют, истинен ли левый операнд, что делает их условными операторами. Он используется обоими и часто цитируется вместе, потому что это одно и то же.
- person Ultimater; 24.11.2017
Я собираюсь немного написать о троичных именах, о том, что они из себя представляют, как их использовать, когда и почему их использовать, а когда нет.
Что такое тернарный оператор?
Тернар ? :
- это сокращение для if
и else
. Вот в основном это. См. "Тернарные операторы" на полпути вниз этой страницы для получения дополнительной официальной объяснение.
Начиная с PHP 5.3:
Начиная с PHP 5.3, можно опустить среднюю часть тернарного оператора. Выражение expr1?: Expr3 возвращает expr1, если expr1 имеет значение TRUE, и expr3 в противном случае.
Начиная с PHP 7.0
В PHP 7 появился новый оператор Null Coalesce. Это то же самое, что и тернарный, но также называется "isset ternary". Это также позволяет использовать набор связанных тернаров, которые устраняют необходимость в проверках 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 paradigm), вам нужно как можно меньше логики на стороне сервера. Таким образом, иногда лучшим выходом является использование тернарного кода и другого сокращенного кода. Под «другим сокращенным кодом» я имею в виду:
if ($isWinner) :
// Show something cool
endif;
Заметьте, мне лично не нравятся такие сокращения, если бред if / 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
Заключение
Тернары действительно просты, и не о чем волноваться. Не рассматривайте какие-либо улучшения скорости, это действительно не имеет значения. Используйте их, когда они просты и выглядят красиво, и всегда следите за тем, чтобы ваш код был доступен для чтения другим в будущем. Если это означает отсутствие тернаров, то не используйте троичные.
if/else
в некоторых ситуациях могут выполняться намного быстрее. Из упомянутого сообщения в блоге вы можете прочитать: На моем ноутбуке фрагмент 1 [тройной] занимает более двух секунд, тогда как фрагмент 2 [if / else] занимает около 0,05 мс. Это большая разница! Но если проверяемая переменная не содержит большого количества данных, скорость почти такая же.
- person m13r; 25.10.2017
Это называется тернарным оператором. Если первое выражение истинно, используется 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;
Работает это следующим образом ...
Например:
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;
$protocol
HTTPS_SERVER
и HTTP_SERVER
в отличие от других ответов. +1
- person ReinstateMonica3167040; 11.09.2017
Это однострочный оператор if:
condition ? true : false
В переводе на обычный оператор if в вашем случае это будет:
if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;
По сути, это изящный способ написания оператора _1 _-_ 2_. Некоторые говорят, что это легче читать, некоторые - нет.
Тернарный оператор в Википедии
Это работает как оператор if, это очень просто и легко, когда вы к нему привыкнете. (условия_выражения)? what_to_do_if_true: what_to_do_if_false.
Как говорит Джон Т., он называется тернарным оператором и по сути является сокращенной версией оператора if / else. Ваш пример, как полный оператор if / else, будет читать;
if($request_type == 'SSL')
{
HTTPS_SERVER;
}
else
{
HTTP_SERVER;
}
poundifdef
говорит, что этот оператор if не полностью (функционально или какой-либо другой) эквивалентен тернарному оператору, потому что весь оператор if / else ничего не оценивает. См. Ответ xpepermint
ниже.
- person ReinstateMonica3167040; 15.10.2018