Вопрос по php – Как называются операторы PHP «?» И «:» и что они делают?

43

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

Например:

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

Ваш Ответ

9   ответов
2

Это короткий способ написания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
72

Этоconditional operator.

$x ? $y : $z

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

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

$x ?: $z

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

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

Мне нравятся условные операторы для операторов возврата (где условие, очевидно, необходимо). Одно ключевое слово возврата, два условия. :)
Я не согласен, но иногда мне кажется, что люди слишком сильно ненавидят своих условных операторов. Я бы сказал, что ?: следует использовать всякий раз, когда это делает код чище и понятнее, и что мы можем предположить, в целях «ясности», что человек, читающий код, легко понимает, что ?: делает.
Лично я люблю выражения условий и нахожу их очень легко читаемыми. Как только вы понимаете, что они являются «IF»; ярлык, вам интересно, что было так сложно в них. Но каждый сам по себе, я думаю. : О)
@grossvogel: Нет, но если это слово действительно или потенциально описываетan infinite number of other thingsтогда да, это означает, что это не может быть названием для него. И тот факт, что вы указываете, делает Zendeven stupiderпоскольку теперь они говорят, что «троичный оператор», как его называют в мономическом смысле, имеет видWHERE IT IS A BINARY OPERATOR.
Конечно, на хороших языках, «если, тогда, еще» это выражение. ;)
0

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

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

Я согласен, но это очень субъективно, и довольно трудно читать, если вы не знаете, как это работает, посмотрите на этот вопрос; p
Это легче читать для коротких заявлений. Как только вы начнете добавлять сложные выражения или вкладывать их, вам следует переключиться на if / else.
Это в основном только для ссылок ответ.
0

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

condition ? true : false

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

if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;
Точно. Я не знаю PHP, но на многих других языках, "если" это утверждение, а не выражение. ?: возвращает выражение, а не утверждение.
Хорошо, но я думаю, что дал ответ, который объяснил ему, что будет делать одна строка в предложении.
Перечитайте его пример: OP отбрасывает значение оператора, поэтому с вашим кодом все в порядке!
Не совсем; оператор оценивает значение, которое ваш код не делает.
-1

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

if($request_type == 'SSL')
{
    HTTPS_SERVER;
}
else
{
    HTTP_SERVER;
}
Это не имеет смысла.poundifdef говорит, что это выражение if не полностью («функционально» или любого другого вида) эквивалентно тернарному оператору, потому что весь оператор if / else не оценивает что-либо. Увидетьxpepermintответ ниже.
Не уверен, что вы имеете в виду. Единственная эквивалентность, которая имеет здесь значение, это функциональная эквивалентность, не так ли?
Правильно, но весь блок if-else должен был бы что-то вычислять, чтобы он был эквивалентен оператору. Но поскольку ОП отбрасывает значение ... Я думаю, этот код в порядке?
Конечно, условный оператор оценивает что-то, это было бы бесполезно, если бы не. Но пример OP вообще не содержит назначения, поэтому мой пример в точности эквивалентен (если не самый полезный способ ответить на вопрос, конечно)
6

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

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

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

variable = condition ? expression1 : expression2;

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

  1. Firstly, condition is evaluated.
  2. If the condition is true, then expression1 is evalauated. And the value of expression1 is assigned to the variable.
  3. If the condition is false, then expression2 is evaluated. And the value of expression2 is assigned to the variable.

Например:

x = (a>b) ? 5 : 9

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

Ternary Operator

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

x ? y : z

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

28

I'm going to write a little bit on ternaries, what they are, how to use them, when and why to use them and when not to use them.

What is a ternary operator?

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

As of PHP 5.3:

Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise.

As of PHP 7.0

PHP 7 has new Null Coalesce Operator. This is the same as a ternary but is also called an "isset ternary". This also allows a set of chained ternaries that remove the need for isset() checks.

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

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

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

$result = $nonExistentVariable ?? ‘default’;

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

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

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

How are ternaries used?

Вот как нормально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';

Why do people use them?

Я думаю, что троицы сексуальны. Некоторые разработчики любят выпендриваться, но иногда троичные простоlook nice в вашем коде,especially в сочетании с другими функциями, такими как последние версии 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;

Note, I personally do not like this kind of shorthand if / endif nonsense

How fast is the ternary operator?

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

чтениеэта почтаРазница составляет около 0,5 мс. Это много!

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

When not to use ternaries

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

  • Easy to read
  • Easy to understand
  • Easy to modify

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

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."));

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

  • Ridiculously long ternary embedding
  • Could've just used a switch statement
  • It was orange in the first place

Conclusion

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

Разница между троичным и if / else (с огромными массивами) составляет 2 секунды, а не 0,5 мс. Это было измерено с использованием только 100 итераций, а не тысяч. Это может быть еще один аргумент, чтобы использовать if / else вместо троичного ...
@ m13r Вы пропустили: «Это много, только если вы делаете тысячи и тысячи из них подряд, многократно».
Мое не было научным объяснением, оно было довольно общим. Если вы хотите добавить еще несколько чисел и изменить неконкретные части, отредактируйте их, и я приму редактирование.
if/else заявления могут в некоторых ситуациях быть намного быстрее. Из упомянутого поста в блоге вы можете прочитать: «На моем ноутбуке фрагмент 1 [троичный] занимает более двух секунд, тогда как фрагмент 2 [if / else] занимает около 0,05 мс. Это большая разница! Но если проверяемая переменная не содержит много данных, скорость практически одинакова. & Quot;
12

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

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

if ($request_type == 'SSL') {
   HTTPS_SERVER;
}
else {
   HTTP_SERVER;
}
@deathlock Этот код плагиат из ответа Мэтью в 7/3/09 17:32 UTC.
Да, Википедия на моей стороне в этом деле. :)
Это неthe троичный оператор, простоa троичный оператор. Тернарный означает, что функция (оператор) принимает три аргумента.
Смотрите такжеstackoverflow.com/questions/798545/…

Похожие вопросы