Каковы операторы ?
и :
в PHP?
Например:
(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
Каковы операторы ?
и :
в PHP?
Например:
(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
Это условный оператор.
$x ? $y : $z
означает "if $x
true, затем используйте $y
, в противном случае используйте $z
".
Он также имеет короткую форму.
$x ?: $z
означает "если $x
истинно, тогда используйте $x
, в противном случае используйте $z
".
Люди скажут вам, что ?:
является "тройным оператором". Это не верно. ?:
- тернарный оператор, что означает, что он имеет три операнда. Люди замирают, думая, что его имя - "тройственный оператор", потому что он часто является единственным тернарным оператором данного языка.
Я собираюсь написать немного о тройниках, о том, что они есть, как их использовать, когда и почему их использовать и когда их не использовать.
Что такое тернарный оператор?
Тройной ? :
является сокращением для if
и else
. Это в основном это. См. "Терминальные операторы" на полпути вниз эта страница для более официального объяснения.
Начиная с PHP 5.3:
С PHP 5.3 можно исключить среднюю часть тернарного оператора. Expression expr1?: Expr3 возвращает expr1, если expr1 имеет значение TRUE и expr3 в противном случае.
Начиная с PHP 7.0
В PHP 7 появился новый оператор Null Coalesce. Это то же самое, что и тернарный, но также называется isset trernary". Это также позволяет набор цепочечных троек, которые устраняют необходимость проверки 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
true; если это так, то вместо этой операции положите y
, иначе z
.
$hello = $something ? "Yes, it true" : "No, it 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;
Это оператор с одной строкой:
condition ? true : false
Переведенный на обычный оператор if в вашем случае, это будет:
if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;
Это в основном причудливый способ написания оператора if
- else
. Некоторые говорят, что читать легче, некоторые говорят, что нет.
Как говорит Джон Т, он называется тернарным оператором и по существу является сокращенной версией оператора if/else. Ваш пример, как полный оператор if/else, будет читать:
if($request_type == 'SSL')
{
HTTPS_SERVER;
}
else
{
HTTP_SERVER;
}