Конструкция if..else и тернарная операция
Последнее обновление: 07.03.2021
Условные конструкции позволяют направлять работу программы в зависимости от условия по одному из возможных путей. И одной из таких конструкций в языке PHP является конструкция if..else
Конструкция if..else
Конструкция if (условие)
проверяет истинность некоторого условия, и если оно окажется истинным, то выполняется блок выражений, стоящих после if. Если же
условие ложно, то есть равно false, тогда блок if не выполняется. Например:
<?php $a = 4; if($a>0){ echo "Переменная a больше нуля"; } echo "<br>конец выполнения программы"; ?>
Блок выражений ограничивается фигурными скобками. И так как в данном случае условие истинно (то есть равно true): значение переменной $a больше 0, то блок инструкций в фигурных скобках также будет выполняться. Если бы значение $a было бы меньше 0, то блок if не выполнялся.
Если блок if содержит всего одну инструкцию, то можно опустить фигурные скобки:
<?php $a = 4; if($a>0) echo "Переменная a больше нуля"; echo "<br>конец выполнения программы"; ?>
Можно в одной строке поместить всю конструкцию:
if($a>0) echo "Переменная a больше нуля";
В данном случае к блоку if относится только инструкция echo "Переменная a больше нуля";
else
Блок else содержит инструкции, которые выполняются, если условие после if ложно, то есть равно false:
<?php $a = 4; if($a > 0){ echo "Переменная a больше нуля"; } else{ echo "Переменная a меньше нуля"; } echo "<br>конец выполнения программы"; ?>
Если $a больше 0, то выполняется блок if, если нет, то выполняется блок else.
Поскольку здесь в обоих блоках по одной инструкции, также можно было не использовать фигурные скобки для определения блоков:
if($a > 0) echo "Переменная a больше нуля"; else echo "Переменная a меньше нуля";
elseif
Конструкция elseif вводит дополнительные условия в программу:
$a = 5; if($a>0){ echo "Переменная a больше нуля"; } elseif($a < 0){ echo "Переменная a меньше нуля"; } else{ echo "Переменная a равна нулю"; }
elseif
. И если ни одно из условий в if или elseif не выполняется, тогда срабатывает блок else.Определение условия
Выше в качестве условия применялись операции сравнения. Однако в реальности в качестве условия может применяться любое выражение, а не только такое,
которое возвращает true
или false
. Если передаваемое выражение равно 0, то оно интерпретируется как значение false
.
Другие значения рассматриваются как true
:
if (0) {} // false if (-0.0) {} // false if (-1) {} // true if ("") {} // false (пустая строка) if ("a") {} // true (непустая строка) if (null) {} // false (значие отсутствует)
Альтернативный синтаксис if
PHP также поддерживает альтернативный синтаксис для конструкции if..else
,
при которой вместо открывающей фигурной скобки ставится двоеточие, а в конце всей конструкции ставится ключевое слово endif.
$a = 5; if($a > 0): echo "Переменная a больше нуля"; elseif($a < 0): echo "Переменная a меньше нуля"; else: echo "Переменная a равна нулю"; endif;
Комбинированный режим HTML и PHP
Также мы можем написать конструкцию if.
иным образом, переключаясь внутри конструкции на код HTML:
<!DOCTYPE html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <?php $a = 5; ?> <?php if ($a > 0) { ?> <h3>Переменная a больше нуля</h3> <?php } ?> </body> </html>
В данном случае само условие указывется в отдельном блоке php: <?php if ($a > 0) { ?>
. Важно, что при этом
этот блок содержит только открывающую фигурную скобку «{«.
Завершается конструкция if другим блоком php, который содержит закрывающую фигурную скобку: <?php } ?>
Между этими двумя блоками php располагается код, который отображается на html-странице, если условие в if истинно. Причем этот код представляет именно код html,
поэтому здесь можно разместить различные элементы html, как в данном случае элемент <h3>
При необходимости можно добавить выражения else
и elseif
:
<!DOCTYPE html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <?php $a = -5; ?> <?php if ($a > 0) { ?> <h3>Переменная a больше нуля</h3> <?php } elseif($a < 0) { ?> <h3>Переменная a меньше нуля</h3> <?php } else { ?> <h3>Переменная a равна нулю</h3> <?php } ?> </body> </html>
Также можно применять альтернативный синтаксис:
<!DOCTYPE html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <?php $a = 0; ?> <?php if ($a > 0): ?> <h3>Переменная a больше нуля</h3> <?php elseif($a < 0): ?> <h3>Переменная a меньше нуля</h3> <?php else: ?> <h3>Переменная a равна нулю</h3> <?php endif; ?> </body> </html>
Тернарная операция
Тернарная операция состоит из трех операндов и имеет следующее определение: [первый операнд - условие] ? [второй операнд] : [третий операнд]
.
В зависимости от условия тернарная операция возвращает второй или третий операнд: если условие равно
, то возвращается второй операнд;
если условие равно false
, то третий. Например:
$a = 1; $b = 2; $z = $a < $b ? $a + $b : $a - $b; echo $z;
Если значение переменной $a меньше $b и условие истинно, то переменная $z будет равняться $a + $b
. Иначе значение $z будет равняться
$a - $b
НазадСодержаниеВперед
Тернарный оператор и альтернативный синтаксис | PHPClub
alexblade
Новичок
- #1
нашел алт синтексис для if
а возможно чтото подобное применить для тернарного оператора. .
чтото наподобе <?=($p==123) ? {?> <p>1</p> <? }: ‘2’?>
ну только чтоб правильно и какие есть варианты ?
С.
Продвинутый новичок
- #2
PHP:
<?=($p==123) ? '1' : '2'?>
Не стоит совать тернарный оператор куда не попадя, чтобы съэкономить полтора символа. У него отсутствует наглядность.
PHP:
<?if($p==123):?> 1 <?else:?> 2 <?endif?>
alexblade
Новичок
- #3
или <?if($p==123){?> 1 <?}else{?> 2 <?}?> про это я знаю
я спрашиваю имено про тернарный алт способ ?
Вурдалак
I’d like to model your domain
- #4
alexblade написал(а):
я спрашиваю имено про тернарный алт способ ?
Нажмите для раскрытия. ..
Странный вопрос. Тебе лучше знать спрашиваешь ты или нет.
Фанат
oncle terrible
- #5
Не стоит совать тернарный оператор куда ни попадя, чтобы сэкономить полтора символа. У него отсутствует наглядность.
alexblade
Новичок
- #6
Фанат
да наоборот я добавляю пару символов (все эти открыть / закрыть тэги чем просто ‘1’ : ‘2’ ) суть то не в укорочении и удленении кода или его наглядности и прозрачности. а просто знать возможности языка… я например и про тернары и алт синтаксиса if не знал пару лет назад.. а сейчас вот в качестве познания пытаюсь до копаться до истины если можно алт синтаксис как то прикрутить к тернару (пусть даже это не красивый код будет) , интересует впринципе это возмоожно (как возможность языка) ?
если нет, буду знать что алт синтаксис есть только у if,
если же да, то хотелось бы расширить свои знания
С.
Продвинутый новичок
- #7
В отличии от синтаксической КОНСТРУКЦИИ, нельзя просто взять и разделить на куски ОПЕРАТОР.
artoodetoo
великий и ужасный
- #8
1. У тернарного оператора НЕТ альтернативного синтаксиса.
2. Видимо тернарный оператор невозможно порвать ?> <?php
3. В месиве кода и HTML хорошо читается «альтернативный if», т.к. с ним скобочки не теряются. Незачем искать менее выразительные способы
Laravel — Blade. Альтернативный метод объявления тернарного оператора и передача функции его результата как.. | PHPClub
JavaScript отключён. Чтобы полноценно использовать наш сайт, включите JavaScript в своём браузере.
- Автор темы Vano
- Дата начала
Vano
Новичок
- #1
в шаблонизаторе blade можно объявить тернарный оператор так:
PHP:
{{ isset($var) ? $var : 'default' }}
и альтернативный способ:
PHP:
{{ $var or 'default' }}
Есть проблема. Если такую конструкцию передавать сразу в параметр функции:
PHP:
{{ Form::text('email', $user->email or 'default' ...) }}
То в input подставится цифра 1. Если использовать привычный синтаксис,то всё работает исправно.
пробовал положить в скобки
PHP:
... ($user->email or 'default') ...
тот же результат
Есть возможность это поправить?
WMix
герр M:)ller
- #2
есть грязный хак если че
PHP:
{{--*/ $email =isset($user->email) ? $user->email : 'default' /*--}} {{ Form::text('email', $email . ..) }}
Vano
Новичок
- #3
Хз уж лучше, мне кажется, просто иссет запихнуть в параметр. Но всё равно спасибо.
А еще вопрос: Я тут потестил, если создавать инпуты через Form хелпер и в контроллере отдавать ->withInput() — то в value инпутов подставляются old(‘%attribute%’). Эт правда? Кто-нить знает на 100%?
Vano
Новичок
- #4
Ну на 95% хотяб))
AmdY
Пью пиво
- #5
не используй or, это очередной кривой костыль реализованный через сидельное место, так как использует зарезервированный оператор. Если используешь php 7 используй новый ??. А так лучше используй isset без всякой магии
Vano
Новичок
- #6
Понял. Спасибо за совет.
Войдите или зарегистрируйтесь для ответа.
Поделиться:
Facebook Twitter WhatsApp Ссылка
Использование тернарного оператора в PHP
В этом руководстве вы узнаете, как использовать тернарный оператор в языке программирования PHP.
Тернарный оператор в PHP — это условный оператор, который позволяет выполнять оператор в зависимости от того, является ли условие истинным
или ложным
.
Использование тернарного оператора похоже на написание оператора «if…else» в PHP, но более лаконично и, возможно, более читабельно.
Этот оператор PHP лучше всего использовать, когда вам нужно присвоить переменной значение в зависимости от того, истинно или ложно условие. Это позволяет сократить пять строк кода до одной.
В следующих нескольких разделах вы изучите синтаксис тернарного оператора и различные способы его использования.
Синтаксис тернарного оператора PHP
Давайте начнем с изучения синтаксиса тернарного оператора в PHP. Синтаксис даст вам представление о том, как пишется оператор.
Тернарный оператор записывается с использованием вопросительного знака ( ?
), за которым следует двоеточие ( :
). Эти два символа можно записать отдельно, как « ? :
» или с использованием короткой версии с обоими символами рядом друг с другом « ?:
».
Поведение оператора немного меняется в зависимости от того, как оно написано.
Полный синтаксис
Начнем с отдельной версии тернарного оператора в PHP. При этом у вас будет три разных операнда.
Первый операнд — это условие, которое PHP оценивает как true
или false
.
После этого вы пишете вопросительный знак ( ?
), за которым следует выражение, которое запустит PHP, если условие истинно
.
Наконец, вы напишите двоеточие ( :
), за которым следует выражение, которое вы хотите выполнить, если условие было ложным
.
Если условие ( CONDITION
) равно true
, PHP вернет левое выражение ( TRUE_EXPRESSION
).
Если условие ( УСЛОВИЕ
) равно false
, PHP вернет правильное выражение ( FALSE_EXPRESSION
).
Сокращенный синтаксис
Тернарный оператор также имеет сокращенный синтаксис, позволяющий удалить среднее выражение. Эта сокращенная версия оператора полезна, когда условие, которое вы хотите оценить, содержит значение, которое вы хотите вернуть.
Сначала вы пишете условие, которое PHP будет оценивать. С сокращенным тернарным оператором в PHP это условие является значением, которое PHP вернет, если условие равно true
.
После условия вы напишете вопросительный знак ( ?
), за которым сразу следует двоеточие ( :
).
Наконец, напишите выражение, которое вы хотите вычислить, если условие ложно
.
Если условие ( CONDITION
) равно true
, PHP вернет выражение условия.
Если условие ( УСЛОВИЕ
) равно false
, PHP вернет правильное выражение ( FALSE_EXPRESSION
).
Использование тернарного оператора в PHP
Теперь, когда мы знаем синтаксис тернарного оператора, давайте покажем вам несколько способов использования этого оператора в PHP.
Основное использование тернарного оператора в PHP
В нашем первом примере мы рассмотрим основное использование тернарного оператора в PHP.
Мы начинаем этот пример с создания переменной с именем « $count
» и присвоения ей значения 20
.
В следующей строке мы используем тернарный оператор PHP, чтобы присвоить значение нашей переменной « $text
». Для нашего условия мы проверяем, меньше ли наша переменная « $count
», чем 30
.
Если значение меньше 30
, в переменную будет возвращена строка PHP "Количество меньше 30"
.
Однако, если значение больше или равно 30
, переменной будет присвоено значение «Счетчик больше 30»
.
Мы используем оператор echo в PHP для вывода окончательного значения, хранящегося в нашей переменной « $text
».
Ниже приведен результат, который вы должны получить из приведенного выше PHP-скрипта.
Вы можете видеть, что PHP оценил условие тернарного оператора как true
, а переменной « $text
» была назначена строка «Количество меньше 30»
.
Полная альтернатива тернарному оператору
Теперь, если бы вы написали наш вышеприведенный пример, используя оператор if…else на PHP, он выглядел бы так, как мы показали ниже.
Сразу видно, как тернарный оператор позволяет писать более лаконичный PHP-код.
Использование сокращенного тернарного оператора в PHP
Как упоминалось ранее, PHP также имеет сокращенную версию своего тернарного оператора, позволяющую вырезать средний операнд.
С вырезом посередине «условие» превращается в элемент, который возвращает PHP, как мы вскоре покажем.
Мы начинаем этот пример с создания переменной с именем « $tutorial
» и присвоив ему значение « Тернарный оператор PHP
».
В нашей следующей строке мы определяем переменную с именем « $ title
», где мы используем сокращенный тернарный оператор для определения ее значения.
Если переменная « $tutorial
» имеет значение true
, то ее значение будет возвращено и присвоено переменной « $title
».
Однако, если переменная оценивается как false
, тогда PHP назначит « $ title
”переменная значение "Не задан заголовок учебника"
.
Оператор echo распечатает значение, хранящееся в переменной « $text
».
Ниже вы можете видеть, что, поскольку наша переменная « $tutorial
» имела допустимое значение, она была оценена как true
. Это означает, что переменной « $title
» было присвоено значение, хранящееся в переменной « $tutorial
».
Полная альтернатива сокращенному тернарному оператору
Если бы вы написали этот же пример на PHP без использования сокращенного тернарного оператора, он выглядел бы немного похоже на то, что мы показали ниже.
Объединение сокращенного тернарного оператора в цепочку
Давайте начнем этот раздел с того, что вам не следует связывать вместе полные тернарные операторы. Его поведение отличается от других языков до PHP 8.0, а начиная с PHP 8.0 поведение вообще не поддерживается.
Однако PHP поддерживает объединение сокращенных тернарных операторов в цепочку, и это может быть полезно для использования.
При использовании сокращенного тернарного оператора каждое выражение будет оцениваться слева направо. Он вернет первое выражение, которое не является ложным.
Самый простой способ продемонстрировать это поведение — использовать быструю серию связанных коротких тернарных операторов. Выполнение этого примера быстро покажет вам, как PHP оценивает эти связанные операторы.
Ниже вы можете увидеть результат предыдущего примера. При этом вы можете увидеть, как PHP оценивал каждый связанный тернарный оператор.
Заключение
В этом руководстве мы показали вам, как использовать тернарный оператор в PHP.
Этот оператор невероятно полезен для написания более читабельного и лаконичного кода. Кроме того, полезно помочь вам избежать использования более крупного оператора if…else, когда он не нужен.
Пожалуйста, прокомментируйте ниже, если у вас есть какие-либо вопросы об использовании тернарного оператора.
Чтобы узнать больше, ознакомьтесь со многими другими руководствами по PHP. Или ознакомьтесь с другими нашими руководствами по кодированию, если вы хотите выучить новый язык.
PHP if, else, switch, match & ternary Учебное пособие по условному управлению потоком
- Что такое условное управление потоком
- Как использовать оператор if
- Как использовать лестницу else..if
- Как использовать else резервный оператор
- Расположение фигурной скобки
- Какое расположение фигурной скобки использовать
- Как вложить операторы if, else..if и else
- Как использовать оператор switch
- Случай по умолчанию
- Условия Fallthrough
- Выражение соответствия
- Switch vs. Match. Какой из них мы используем?
- Альтернативный синтаксис if и switch
- Тернарный оператор как сокращение для if
- Резюме
Что такое условный поток управления
PHP позволяет нам управлять потоком нашего приложения, оценивая условные выражения и выполняя разделы кода на основе результата.
В качестве примера рассмотрим приложение, позволяющее создать базу пользователей. После регистрации пользователь может войти в личный кабинет администратора и выполнять определенные задачи.
Процесс входа будет осуществляться по следующей (упрощенной) логике:
- Проверить адрес электронной почты и пароль пользователя по базе данных.
- Если адрес электронной почты и пароль пользователя верны, пропустите их в личный кабинет. Если нет, попросите пользователя повторить попытку.
Шаг 2 — это наша условная логика. В коде это будет выглядеть примерно так.
Пример: условная логика
, если имя пользователя И пароль == правильно выполнить код для входа выполнить код для перенаправления в личный кабинет в противном случае попросить пользователя повторить попытку
Итак, определенные разделы кода выполняются в зависимости от результатов выполнения условий.
Как использовать оператор if
Оператор if состоит как минимум из 3 токенов.
- если ключевое слово.
- Блок условия для нашего условия, завернутый в () (круглые скобки)
- Блок выполнения логики, которую мы хотим выполнить, если условие окажется истинным, завернутый в {} (фигурные скобки)
Синтаксис:
if (условное выражение) { // код выполнения }
Заявление выглядит следующим образом:
если (условие истинно), выполнить { код }.
Пример: оператор if
if (1 + 1 == 2) { echo "Код выполнения выполнен."; }
В приведенном выше примере мы проверяем, равно ли 1 + 1 2. Конечно, это так, и поэтому интерпретатор будет иметь разрешение войти в блок кода между фигурными скобками и выполнить оператор echo.
Как использовать лестницу else..if
Оператор else..if — это необязательное условие, которое позволяет нам оценивать больше условий, когда условие if оценивается как ложное.
Мы просто пишем еще один оператор if под нашим первым и разделяем два с помощью еще ключевое слово.
Синтаксис:
if (условное выражение) { // оператор выполнения } еще если (условное выражение) { // оператор выполнения }
Когда условие оператора if окажется ложным, интерпретатор оценит условие else if.
Пример: оператор else..if
if (false) { echo "Основной оператор if"; } еще если правда) { echo "Вторичный оператор if (else..if)"; }
Поскольку условие if ложно, интерпретатор перейдет к следующему в группе и оценит его условие. Если условие окажется истинным, как в примере, он выполнит блок выполнения этого оператора.
Нам разрешено создавать столько операторов if, сколько нам нужно. Вот почему это называется лестницей.
Пример: множественное else..if
$num = 1; если ($num * $num == 10) { echo "Основной оператор if"; } еще если ($num * $num > 5) { echo "Вторичный оператор if"; } еще если ($num * $num > 0) { echo "Третичный оператор if"; }
Интерпретатор спустится по лестнице и выполнит блок выполнения любого оператора, если его условие окажется истинным.
Как использовать резервный оператор else
Дополнительный еще оператор работает как ловушка для всего, что не улавливает if и/или else if. Думайте об этом как о крайней ситуации.
Оператор else не имеет условного выражения, но допускает блок кода выполнения.
Синтаксис:
if (условное выражение) { // оператор выполнения } еще { // универсальный }
Пример: оператор else
$num = -1; если ($num * $num == 10) { echo "Основной оператор if"; } еще если ($num * $num > 5) { echo "Вторичный оператор if"; } еще { echo "Поймать все, что не охватывается оператором if и/или else..if"; }
В приведенном выше примере результат обоих вычислений if будет ложным, поэтому будет выполнен код в резервном блоке else.
Расположение фигурной скобки
Существует два соглашения о том, где размещать открывающую фигурную скобку в языках, использующих фигурные скобки для определения локальной области действия инструкции.
- Открывающая фигурная скобка в той же строке, что и заголовок.
- Открывающая фигурная скобка в строке, следующей за заголовком.
Пример: положение фигурной скобки
if (true) { // фигурная скобка той же строки } если правда) { // фигурная скобка отдельной строки }
Какую фигурную скобку использовать
В PHP принято писать фигурную скобку в той же строке, что и заголовок, но это на ваше усмотрение. Важно оставаться последовательным.
В этом курсе мы будем следовать правилам PHP и рекомендуем вам делать то же самое.
Как вложить операторы if, else..if и else
Иногда нам нужно оценивать условия на основе результатов предыдущего условия.
PHP допускает вложенность условий, и это так же просто, как поместить оператор if внутри другого оператора if.
Синтаксис:
if (условное выражение) { // оператор выполнения если (условное выражение) { // оператор выполнения } }
Пример: вложенные условные операторы
if (true) { echo "Основной оператор if"; эхо "
"; если (ложь) { echo "Вложенный оператор if"; } еще { echo "Вложенный оператор else"; } }
Интерпретатор будет анализировать код иерархически, что означает, что если условие внешнего оператора if окажется истинным, он перейдет к внутренним операторам и обработает их, прежде чем перейти к каким-либо внешним условиям else.
примечание Несмотря на то, что нам разрешено вкладываться так глубоко, как мы хотим, мы не должны этого делать. Общее эмпирическое правило заключается в том, что если нам нужно вложить более 3 уровней в глубину, мы должны попробовать другой подход.
Как использовать оператор switch
А выключатель оператор, по сути, представляет собой серию операторов if при одном и том же условии.
В качестве примера давайте рассмотрим, что нам нужно оценить, находится ли число в диапазоне от 1 до 10. Для каждого числа мы хотим выполнить разные операторы.
В обычном случае группировка выглядела бы следующим образом.
Пример: если
$num = 5; если ($ число == 1) { эхо $ число; } иначе если ($num == 2) { эхо $ число; } иначе если ($num == 3) { эхо $ число; } иначе если ($num == 4) { эхо $ число; } иначе если ($num == 5) { эхо $ число; } иначе если ($num == 6) { эхо $ число; } // так далее...
Хотя приведенный выше пример вполне хорош, его трудно прочитать с первого взгляда, и приходится много печатать. Особенно, если учесть, что выражение оценки каждый раз меняется незначительно.
Здесь пригодится оператор switch. Давайте рассмотрим тот же пример, но в качестве переключателя вместо оператора if.
Пример: переключатель
$num = 2; переключатель ($ число) { Случай 1: эхо $ число; ломать; случай 2: эхо $ число; ломать; случай 3: эхо $ число; ломать; // так далее... }
Код стал намного чище, читается четче и меньше нужно печатать. Но с другой стороны, код менее компактен.
Рассмотрим более простой оператор switch.
Пример: оператор switch
$num = 1; переключатель ($ число) { Случай 1: эхо $ число; ломать; }
Теперь давайте разберем это шаг за шагом.
- Во-первых, мы используем выключатель ключевое слово.
- Затем в скобках мы пишем значение, которое мы хотим сравнить с другими значениями. В этом случае мы хотим проверить, соответствует ли что-то значению $num .
- Затем мы определяем область вычислений с помощью открывающих и закрывающих фигурных скобок.
Далее мы определяем наши случаи сравнения. Мы делаем это с помощью кейс ключевое слово, за которым следует значение сравнения и двоеточие.
Заявление гласит: если $num == 1, то делаем то, что следует после оператора двоеточия
После оператора двоеточия мы предоставляем операторы выполнения. В этом случае мы просто повторяем значение $num .
Наконец, мы используем ломать оператор управления, чтобы выйти из переключателя. Мы сообщаем интерпретатору, что нашли то, что искали, поэтому он должен прекратить выполнение переключателя и перейти к коду снаружи и ниже него.
Мы рассмотрим операторы управления после циклов в операторах управления. урок, потому что они используются как с условным, так и с циклическим потоком управления.
примечание Оператор switch оценивается с нечеткими сравнениями (==). Он не проверяет тип значения.
Случай по умолчанию
Мы можем указать запасной случай, если ни один из других случаев не подходит. Это версия предложения else оператора switch.
Вместо записи кейс ключевое слово, мы используем дефолт без значения. Для исполнительного блока мы указываем резервное поведение и выход из режима переключения.
Пример: по умолчанию
$num = 1; $сообщение = ""; переключатель ($ число) { случай 0: $msg = "Ложь"; ломать; Случай 1: $msg = "Истина"; ломать; дефолт: $msg = "Неизвестно"; ломать; } echo $msg
Условия отказа
Оператор switch в PHP также позволяет выполнять условия перехода. В основном это комбинации регистров.
Пример: условия отказа
$num = 1; $сообщение = ""; переключатель ($ число) { Случай 1: случай 0: $msg = "Ложь"; ломать; Случай 1: $msg = "Истина"; ломать; дефолт: $msg = "Неизвестно"; ломать; } эхо $сообщение
Мы объединяем случай -1 с случаем 0, просто исключая его логику.
Выражение соответствия
В PHP 8 добавлен новый условный оператор, называемый выражение совпадения . Он похож на оператор switch, но предлагает более краткий синтаксис, помимо других улучшений.
Рассмотрим следующее утверждение.
Пример: переключатель
$num = 1; $сообщение = ""; переключатель ($ число) { случай 0: $msg = "Ложь"; ломать; Случай 1: $msg = "Истина"; ломать; дефолт: $msg = "Неизвестно"; ломать; } эхо $сообщение
Теперь давайте посмотрим на то же выражение, переписанное как соответствие выражение.
Пример: совпадение
$msg = совпадение ($num) { 0 => "Ложь", 1 => "Правда", по умолчанию => "Неизвестно", }; echo $msg
Давайте посмотрим на различия в синтаксисе.
- Возвращает значение, которое можно сохранить или игнорировать.
- Футляры (также называемые кронштейнами) имеют случай => значение структуры и отделяются запятой.
- Оператор управления break не используется.
- Выражение заканчивается точкой с запятой.
Наряду с более кратким синтаксисом, выражение соответствия предлагает следующие преимущества.
Более строгие сравнения
Типы не могут сопоставляться по ошибке, поскольку выражение использует строгое сравнение с === оператор вместо == оператор, который использует коммутатор.
Случаи можно комбинировать
Выражение совпадения не допускает ошибок. Но он допускает комбинированные условия, что, по сути, одно и то же.
Пример: комбинированные условия
// отказ переключения переключатель ($ число) { Случай 1: случай 0: $msg = "Ложь"; ломать; } // совпадающая комбинация $msg = совпадение ($ число) { -1, 0 => "Ложь" };
Необработанные значения выдают ошибку
Если мы не укажем значение по умолчанию и выражение совпадения встречает неизвестное значение, интерпретатор выдаст ошибку необработанный матчеррор ошибка.
Пример: необработанное совпадение
$msg = match (5) { 0 => "Ложь", 1 => "Правда", };
Вывод: UnhandledMatchError
Неустранимая ошибка: Uncaught UnhandledMatchError: Необработанное значение совпадения типа int
Исключения
В PHP 8, бросать превратился из оператора в выражение. Это означает, что мы можем генерировать исключения непосредственно из ветви выражения соответствия.
Пример: throw
$msg = match (-1) { -1 => выдать новый EndTimesError(), 0 => "Ложь", 1 => "Правда", по умолчанию => "Неизвестно" };
Переключение против совпадения. Какой из них мы используем?
В основном это зависит от ситуации и ваших предпочтений.
- Несмотря на то, что синтаксис длиннее и многословнее, переключатель легче читается с первого взгляда.
- Сопоставление также не позволяет использовать многострочные блоки кода, поэтому единственным вариантом будет переключение (кроме блока if, конечно).
Мы предпочитаем использовать переключатель/сопоставление как можно реже на любом языке, который его поддерживает. обычно есть др. шаблоны проектирования или более эффективные решения, которые могут решить проблему, с которой мы сталкиваемся.
Альтернативный синтаксис if и switch
PHP предлагает альтернативный синтаксис для двух своих управляющих структур, что позволяет нам более легко взаимодействовать с другими языками.
Если вы знакомы с языками шаблонов, такими как жидкость, этот тип синтаксиса покажется вам знакомым.
Альтернативный синтаксис заменяет открывающую фигурную скобку : (двоеточие) и закрывающая фигурная скобка с завершающим ключевым словом, которое отличается между if и switch.
Конечным ключевым словом для оператора if является конец .
Синтаксис: альтернатива if
// Альтернатива if если (выражение): // исполнительный блок конец; // Встроенная альтернатива, если // исполнение
Пример: альтернатива if
Альтернативный пример синтаксиса if 2
В случае оператора switch конечное ключевое слово становится концевой выключатель .
Пример: альтернативный оператор switch
Мы нашли совпадение!
Тернарный оператор как сокращение для if
PHP предлагает нам тернарный оператор как более короткий способ написать оператор if/else, каждый из которых имеет только один оператор выполнения.
В качестве примера рассмотрим простой оператор if.
Пример:
if (true) { echo "True"; } еще { эхо "Ложь";}
Предложения if и else содержат только по одному оператору выполнения. Если это так, мы можем написать его сокращенную версию с помощью тернара.
Тернар начинается с нашего условного выражения, за которым следует ? (вопросительный знак). Затем мы указываем код выполнения, если условие оказывается истинным, за которым следует : (двоеточие) и код выполнения, если выражение оценивается как false.
Синтаксис:
выражение ? исполнение_если_истина : выполнение_если_ложь;
Результат можно использовать напрямую или сохранить в контейнере данных.
Пример: тернарный оператор
// Используется напрямую эхо правда? «Верно»: «Ложно»; // Сохранено $результат = истина? «Верно»: «Ложно»; // Тернар читается следующим образом // если (истина) { "Истина" } иначе { "Ложь" } $результат = истина? «Верно» : «Ложно»;
Резюме: что нужно помнить
- Поток управления — это когда мы выполняем код на основе результата условия.
- Оператор if состоит как минимум из 3 токенов. если ключевое слово, блок условия и блок выполнения.
- Лестничная диаграмма else..if обрабатывает последующие условия, которые не выражены в операторе if.
- Лестница else..if не может существовать сама по себе и должна следовать оператору if
- Резервная схема else обрабатывает любую другую ситуацию, которую не покрывают лестничные конструкции if и else..if.
- Запасной вариант else не использует блок условия и не может существовать сам по себе, он должен следовать либо за оператором if, либо за лестницей else. .if.
- В PHP принято писать открывающие фигурные скобки в той же строке, что и заголовок инструкции.
- Операторы switch оценивают одно значение по многим случаям.
- После каждого случая мы должны вырваться из выключателя с ломать контрольное заявление.
- Логика case может быть многострочным исполнительным блоком и может содержать другие условные операторы.
- Хотя это и не требуется, мы должны включить резервное значение по умолчанию в конце наших операторов switch.
- Дела можно объединять, удаляя их блоки выполнения и управляющие операторы break.
- Операторы switch оцениваются с помощью оператора свободного сравнения (==).
- Условные операторы могут быть вложены в другие условные операторы, они будут оцениваться иерархически.
- Если мы обнаружим, что вложенность превышает 3 уровня, мы должны провести рефакторинг кода и попытаться найти другое решение.
- Выражение соответствия является сокращением для оператора switch.
- Дела написаны на случай => значение структура и руки разделены запятой.
- Оператор break не используется.
- Дела объединяются путем удаления их логики.
- Выражения соответствия не могут содержать многострочные блоки выполнения.
- Выражения сопоставления оцениваются с помощью оператора строгого сравнения (===).
- Поскольку это выражение, оператор должен заканчиваться точкой с запятой.
- Операторы if и switch имеют альтернативный синтаксис, в котором открывающая фигурная скобка заменяется двоеточием, а закрывающая фигурная скобка заменяется завершающим ключевым словом ( конец / концевой выключатель ).
- Тернарное выражение — это сокращение для операторов if/else, которые имеют только одиночные операторы выполнения.
- Тернар начинается с условия, за которым следует вопросительный знак. Затем мы указываем отдельные операторы выполнения true/false, разделенные двоеточием.
сравнение — Использование тернарного оператора PHP только с двумя аргументами
Вопрос задан
Изменено 10 лет, 7 месяцев назад
Просмотрено 3k раз
Недавно я просматривал свой код и заметил, что по рассеянности оставил структуру, подобную следующей:
$guid = empty($subscription->guid) ? : $подписка->руководство;
Теперь этот не делал того, что должен был делать , и неверен , но поскольку это свойство всегда установлено, теперь оно работало нормально, и с версии 5. 3 нет синтаксической ошибки из-за следующего изменения:
Начиная с PHP 5.3, можно опустить среднюю часть тернарного оператора. Выражение expr1 ?: expr3 возвращает expr1, если expr1 принимает значение TRUE, и expr3 в противном случае.
Я не знал об этом изменении, и теперь мне любопытно, использовать его или нет. Это то, чего мне очень не хватало в таких языках, как ruby, где вы можете сделать, например, a = b || c
, чтобы получить либо b
, либо c
, а не «настоящее» логическое значение. Однако синтаксис, который они выбрали для тернарного оператора, кажется мне немного нелогичным. Должен ли я использовать это в производственном коде? Это определенно бросило меня, когда я увидел это случайно.
- php
- сравнение
- операторы
1
Тернарный условный оператор без второго аргумента является немного новым, но он похож 1 на оператор объединения с нулевым значением, который можно найти в других производных от Алгола языках, таких как C# и Perl, и, как вы упомянули, || Оператор
в Ruby (и JavaScript).
Сначала это выглядит странно, но это не так уж и сложно (тем более, что есть прецеденты для подобных операторов в других языках), и это может сэкономить много нажатий клавиш. И, если что случилось с разделителем пространства имён ( \
) является признаком того, что странный синтаксис в конечном итоге будет принят сообществом PHP.
Но одной из основных проблем, с которыми обычно сталкиваются PHP-приложения, является (иногда) мучительно долгое время между выпуском новой версии PHP и моментом, когда хосты начинают ее поддерживать. Это приводит к проблемам, когда вам необходимо обеспечить обратную совместимость со старыми версиями PHP, отказавшись от таких удобных изменений.
Если вас это не беспокоит, и ваша команда согласна на его использование (или если вы разработчик-одиночка, если вам это удобно), то смело действуйте. Как и разделитель пространства имен, я действительно думаю, что это действительно вопрос того, когда, а не если, это будет приемлемо во всех будущих проектах PHP.
Примечание 1 : Но не идентичны, учитывая, что операторы объединения с нулевым значением проверяют только ненулевые значения (а не истинные значения, такие как PHP), а синтаксис ?:
не подавляет неопределенные уведомления, как вы упомянули в комментарии.
2
Мне кажется, что это ошибка в коде. Это выглядит неправильно, и в целом я избегаю использования синтаксиса, который выглядит так, как будто вы допустили ошибку, ради экономии нескольких нажатий клавиш. Когда вы (или кто-то другой) вернетесь к чтению кода позже, я думаю, что эта строка сбьет вас с толку и заставит вас потратить время на разбор того, что она делает, для того, что по сути является простой операцией.
1
Ну, PHP имеет логический тип и || Оператор
возвращает логическое значение, поэтому в PHP результат $a || $b
является логическим значением, это согласуется с &&
, так как с &&
нет особого смысла возвращать одно или другое, но имеет смысл возвращать true
/ false
.