Каковы операторы PHP «?» И «:», и что они делают?

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

Например:

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

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

     $x ? $y : $z 

    означает «если значение $x истинно, тогда используйте $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 , иначе HTTP_SERVER .

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

     if ($request_type == 'SSL') { HTTPS_SERVER; } else { HTTP_SERVER; } 

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

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

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

     variable = condition ? expression1 : expression2; 

    Он работает следующим образом …

    1. Во-первых, условие оценивается.
    2. Если условие истинно, то выражение 1 вычисляется. И значение выражения1 присваивается переменной .
    3. Если условие ложно, тогда выполняется выражение expression2 . А значение 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.

    Это короткий способ написания предложений. Он также используется на других языках, таких как 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; }