Ответ 2
Я собираюсь написать немного о тройниках, о том, что они есть, как их использовать, когда и почему их использовать и когда их не использовать.
Что такое тернарный оператор?
Тройной ? :
является сокращением для 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
- Во-первых, это был оранжевый.
Заключение
Тернары действительно просты и ничто не может слишком затянуться. Не считайте любогоскорости, это действительно не изменит ситуацию. Используйте их, когда они простые и выглядят красиво, и всегда убедитесь, что ваш код будет читаемым другими в будущем. Если это не означает тройников, то не используйте тройники.