Что такое операторы PHP? и: позвонили и что они делают?

Что такое операторы ? и : в PHP?

Например:

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

person seb    schedule 03.07.2009    source источник


Ответы (10)


Это условный оператор.

$x ? $y : $z

означает «если $x истинно, то используйте $y; в противном случае используйте $z».

У него также есть краткая форма.

$x ?: $z

означает «если $x истинно, то используйте $x; в противном случае используйте $z».

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

person chaos    schedule 03.07.2009
comment
По возможности этого следует избегать, за исключением самых простых случаев. ИМХО это затрудняет чтение старого. - person HeretoLearn; 03.07.2009
comment
Я не возражаю, но иногда мне кажется, что люди слишком далеко заходят в своей ненависти к условным операторам. Я бы сказал, что?: Следует использовать всякий раз, когда это делает код чище и яснее - и что мы можем предположить, для большей ясности, что человек, читающий код, легко понимает, что?: Делает. - person chaos; 03.07.2009
comment
Я люблю условные операторы ... :( - person micmoo; 03.07.2009
comment
Мне нравится условный оператор для операторов возврата (где условие, очевидно, необходимо). Одно ключевое слово return, два условия. :) - person Yohnny; 03.07.2009
comment
Конечно, в хороших языках, if, else является выражением. ;) - person Deniz Dogan; 03.07.2009
comment
Лично я люблю выражения условий и считаю их очень легко читаемыми. Как только вы понимаете, что это ярлык «ЕСЛИ», вы задаетесь вопросом, что в них такого сложного. Но думаю, каждому свое. : o) - person Gary Willoughby; 18.07.2009
comment
Я буквально думал, что это называется тернарным оператором. Спасибо за разъяснения. - person Tom; 22.07.2009
comment
Из документации php php.net/manual/en/migration53.new-features. php: тернарный оператор теперь имеет сокращенную форму:?: То, что слово описывает объект, не означает, что оно не может быть его именем. - person grossvogel; 25.07.2010
comment
@grossvogel: Нет, но если это слово на самом деле или потенциально описывает бесконечное множество других вещей, тогда да, это означает, что это не может быть его названием. И тот факт, что вы указываете, делает Zend еще более глупым, поскольку теперь они говорят, что тернарный оператор, как они идиотски называют его, имеет форму WHERE IT IS A BINARY OPERATOR . - person chaos; 25.07.2010
comment
@chaos: Мы узнаем это от наших учителей в школах или на работе. Затем мы воспроизводим это. Хорошо поправлять нас, ведь мы жертвы мужского образования. - person Iiridayn; 07.09.2010
comment
@chaos: Хороший -1 за то, что вы называете других глупцами и за ваше вопиющее отрицание лингвистической эволюции. Вызов тернарного оператора ?: хорошо известен; этот термин встречается гораздо чаще, чем условный оператор. - person NikiC; 05.05.2011
comment
@nikic: Если сто тысяч человек прыгают с моста, они все равно глупы. Слова имеют реальное значение, в том числе слова «троичный» и «оператор», и идиоты, повторяющие то, что они не понимают, леммингоподобным образом, не являются результатом лингвистической эволюции. - person chaos; 05.05.2011
comment
Дополнительный +1 для опровержения тернарного оператора. У меня мурашки по коже. - person Lightness Races in Orbit; 05.01.2012
comment
У меня нет проблем с называнием его тернарным оператором. Это единственный оператор с тремя операндами, с которым я когда-либо сталкивался в своей карьере. Просветите нас, если вы можете назвать экземпляр языка программирования любым другим оператором с тремя операндами. С другой стороны, у меня проблема с вызовом его условным оператором, подразумевая, что это единственный оператор, который можно использовать в качестве условия. Тем не менее, у нас есть такие операторы, как 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
  • Во-первых, он был оранжевым

Заключение

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

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

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

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

if ($request_type == 'SSL') {
   HTTPS_SERVER;
}
else {
   HTTP_SERVER;
}
person John T    schedule 03.07.2009
comment
Это не тернарный оператор, а просто тернарный оператор. Тернарный означает, что функция (оператор) принимает три аргумента. - person Deniz Dogan; 03.07.2009
comment
Да, в этом случае Википедия на моей стороне. :) - person Deniz Dogan; 03.07.2009
comment
См. Также stackoverflow.com/questions/798545/ - person chaos; 03.07.2009
comment
Это наиболее понятный ответ. - person deathlock; 08.10.2012
comment
@chaos Вы правы, в Java это называется условным оператором. PHP этого не делает. - person ReinstateMonica3167040; 11.09.2017
comment
@deathlock Этот код заимствован из ответа Мэтью от 03.07.09 17:32 UTC. - person ReinstateMonica3167040; 11.09.2017
comment
@Userthatisnotauser, но разве Джон Т. не ответил первым? В 17:29. - person deathlock; 29.09.2017
comment
Хорошая находка, @Userthatisnotauser! :) И, как и там, этот (тот же) код в таком виде все равно не имеет никакого смысла. Кстати, ответ Мэтью был отвергнут, возможно, по этой причине. (Этот аргумент о функциональной эквивалентности у Мэтью не имеет смысла в этом контексте PHP, поскольку смешивает выражение с четко определенным значением и операторами, которые ничего не делают ...) - person Sz.; 12.10.2018

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

$hello = $something ? "Yes, it's true" : "No, it's false";
person Deniz Dogan    schedule 03.07.2009

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

variable = condition ? expression1 : expression2;

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

  1. Сначала оценивается состояние.
  2. Если условие истинно, то проверяется выражение1. И значение выражения1 присваивается переменной.
  3. Если условие ложно, то вычисляется выражение2. И значение выражения2 присваивается переменной.

Например:

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.

person Community    schedule 23.08.2009

Это короткий способ написания if предложений. Он также используется в других языках, таких как Java, JavaScript и других.

Ваш код,

$protocol = $request_type == 'SSL' ? HTTPS_SERVER : HTTP_SERVER;

можно записать так:

if ($request_type == 'SSL')
    $protocol = HTTPS_SERVER;
else
    $protocol = HTTP_SERVER;
person xpepermint    schedule 03.07.2009
comment
Спасибо за правильное присвоение $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;
person Yngve Sneen Lindal    schedule 03.07.2009
comment
Не совсем; оператор вычисляет значение, чего не делает ваш код. - person poundifdef; 03.07.2009
comment
Точно. Я не знаю PHP, но во многих других языках if это утверждение, а не выражение. ?: возвращает выражение, а не инструкцию. - person Deniz Dogan; 03.07.2009
comment
Перечитайте его пример: OP отбрасывает значение оператора, так что ваш код технически в порядке! - person poundifdef; 03.07.2009
comment
Хорошо, но я думаю, что дал ответ, который объяснил ему, что делать с одной строчкой, если предложение. - person Yngve Sneen Lindal; 03.07.2009

По сути, это изящный способ написания оператора _1 _-_ 2_. Некоторые говорят, что это легче читать, некоторые - нет.

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

person Daniel Magnusson    schedule 03.07.2009
comment
Краткие заявления легче читать. Как только вы начнете добавлять сложные выражения или вкладывать их, вам следует переключиться на if / else. - person DisgruntledGoat; 04.07.2009
comment
Я согласен, но это очень субъективно, и его довольно сложно читать, если вы не знаете, как это работает, см. Этот вопрос; p - person Daniel Magnusson; 04.07.2009
comment
Это в основном ответ только по ссылке. - person Jimbo; 07.09.2017

Это работает как оператор if, это очень просто и легко, когда вы к нему привыкнете. (условия_выражения)? what_to_do_if_true: what_to_do_if_false.

person Amin    schedule 27.04.2020
comment
Ваш ответ на самом деле не добавляет ничего нового. Почти все другие ответы касались этого еще в 2009 году! - person Scratte; 28.04.2020

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

if($request_type == 'SSL')
{
    HTTPS_SERVER;
}
else
{
    HTTP_SERVER;
}
person Mathew    schedule 03.07.2009
comment
Верно, но весь блок if-else должен что-то оценивать, чтобы он был эквивалентен оператору. Но поскольку OP отбрасывает значение ... Полагаю, этот код в порядке? - person poundifdef; 03.07.2009
comment
Не уверен, что вы имеете в виду. Единственная эквивалентность, которая здесь имеет значение, - это функциональная эквивалентность, не так ли? - person Mathew; 04.07.2009
comment
Это не имеет смысла. poundifdef говорит, что этот оператор if не полностью (функционально или какой-либо другой) эквивалентен тернарному оператору, потому что весь оператор if / else ничего не оценивает. См. Ответ xpepermint ниже. - person ReinstateMonica3167040; 15.10.2018
comment
Конечно, условный оператор что-то оценивает, в противном случае он был бы бесполезен. Но пример OP вообще не содержит присваивания, поэтому мой пример точно эквивалентен (если не самый полезный способ ответить на вопрос, предоставлено) - person Mathew; 04.01.2019