- PHP занятие 3. Условные операторы
- Условные операторы php
- PHP оператор if
- Логические операции в условии
- Операции сравнения и правило лжи
- Логические конструкции И ИЛИ и НЕ в условном операторе
- Тернарный оператор PHP
- Порядок выполнения тернарного оператора
- А какая вообще разница?
- Как избежать ошибки?
- Почему оно вообще так происходит?
- Тернарный оператор, switch и Элвис? — PHP: Основы
- Тернарный оператор
- Конструкция Switch
- Оператор Элвис
- Тернарный оператор в JavaScript
- Варианты использования
- Что выбрать: тернарный оператор или if
- Тернарный оператор в PHP
- FullStack CTO
- FullStack CTO
- Шпаргалка
- Тернарный оператор
- Сокращенная запись тернарного оператора
- Null coalescing оператор
- Замечание
PHP занятие 3. Условные операторы
Условные операторы php
Условные операторы php представлены тремя основными конструкциями:
Рассмотрим подробнее каждый из них.
PHP оператор if
Рис 3.1. Условный оператор IF, укороченный вариант
Рис. 3.2. Синтаксис условного оператора IF ELSE
Рис. 3.3. Полный синтаксис условного оператора IF elseif
В условном операторе может использоваться двоеточие : вместо фигурных скобок. В таком случае заканчивается оператор служебным словом endif
Рис. 3.4. Условный оператор If и Endif в php
Пример:
Логические операции в условии
В условии if в скобках могут присутствовать следующие операции:
== | равенство |
!= | неравенство |
> | больше |
меньше | |
>= | больше или равно |
меньше или равно |
Решение:
1 Решение:
2 Решение:
Операции сравнения и правило лжи
В конструкции if в скобках должно находиться логическое выражение или переменная, которые рассматриваются с точки зрения алгебры логики, возвращающая значения либо true либо false
Т.е. в качестве условия может выступать единственная переменная. Рассмотрим пример:
В примере транслятор языка php будет рассматривать переменную в скобках на правило лжи:
Правило ЛЖИ или что считается ложным:
Логические конструкции И ИЛИ и НЕ в условном операторе
$a=1; if (!($a Оператор Switch PHP
Рис. 3.5. Условный оператор Switch
Решение:
Дополните код:
Тернарный оператор PHP
Порядок выполнения тернарного оператора
В php есть интересная особенность тернарного оператора — специфический и уникальный порядок выполнения.
Java и C++ тоже вернут 1
А какая вообще разница?
Я знаю об этом интересном нюансе довольно давно, но буквально вчера обнаружил ошибку в одном из открытых исходников: автор явно не знал об этом нюансе и попался. Потому, данная статья служит всего-лишь предупреждением. Ведь, если программист ожидает от php такого же поведения, как от других языков — может попасть в халепу.
Такой приём очень удобный для задания значений, зависимо от условий. Изящная замена if-else. Например:
Как избежать ошибки?
Первый способ — не использовать тернарный оператор в php.
Второй — прямо указывать порядок выполнения с помощью скобок:
Чем-то напоминает Лисп, не так ли?
Почему оно вообще так происходит?
Давайте разберемся в порядке выполнения тернарного оператора на примере JavaScript vs PHP
Напишем два тестовых скрипта, чтобы понять, как работает каждый из языков.
$ node ternary.js
cond.first
value.first
result: first
$ php ternary.php
cond.first
value.first
value.second
value.third
result: third
Какой из этого результата можно сделать вывод. Javascript разбирает тернарный оператор вполне логично. Сначала проверяет самое левое условие. Если оно верно, то выполняет и возвращает левую часть после первого двоеточия, если не верно, то правую.
Тернарный оператор, switch и Элвис? — PHP: Основы
Тернарный оператор
Посмотрите на определение функции, которая возвращает модуль переданного числа:
В PHP существует конструкция, которая по своему действию аналогична конструкции if-else, но при этом является выражением. Она называется тернарный оператор. Тернарный оператор — единственный в своем роде оператор, требующий три операнда:
Общий паттерн выглядит так:
Если вы помните, в чём сила выражений, то вероятно уже догадались, что тернарный оператор можно вкладывать в тернарный оператор. Не делайте этого 🙂 Такой код тяжело и читать, и отлаживать, это очень плохая практика.
Конструкция Switch
Многие языки в дополнение к условной конструкции if включают в себя switch. Это специализированная версия if, созданная для некоторых особых ситуаций. Например, её имеет смысл использовать там, где есть цепочка if else с проверками на равенство. Например:
Свитч довольно сложная конструкция с точки зрения количества элементов из которых она состоит:
Иногда результат полученный внутри case это конец выполнения функции содержащей switch. В таком случае его нужно как-то вернуть наружу. Для решения этой задачи есть два способа.
Первый. Создать переменную перед switch, заполнить ее в case и затем, вконце, вернуть значение этой переменной наружу.
Второй способ проще и короче. Вместо создания переменной, case позволяет внутри себя делать обычный возврат из функции. А так как после return никакой код не выполняется, то мы можем избавиться от break :
Switch хоть и встречается в коде, но технически всегда можно обойтись без него. Ключевая польза при его использовании в том, что он лучше выражает намерение программиста, когда нужно проверять конкретные значения переменной. Хотя кода и стало, физически, чуть больше, читать его легче в отличие от блоков elseif.
Оператор Элвис
Вообразим задачу: на сайте у пользователей могут быть имена и псевдонимы. Имя не обязательно, но если оно есть, то нужно обращаться к человеку по имени, а если нет, то по псевдониму. Попробуем собрать строку с приветствием человека по этим требованиям:
?: — бинарный оператор, который возвращает первый операнд если он истинен, и второй в ином случае.
Тернарный оператор в JavaScript
Тернарный (или условный) оператор существует во многих языках программирования — например, в C++, Java, Python, PHP и других. Разберёмся, как он работает в JavaScript.
Все операторы различаются по количеству аргументов, к которым они применяются. Например, существует оператор «-», который меняет знак числа на противоположный. Если такой оператор применяется к одному числу, то есть у него один аргумент — он называется унарным.
Кроме унарных операторов, существуют операторы с двумя аргументами — бинарные. Например, бинарный «+» складывает два аргумента:
И, наконец, тернарный оператор:
Это единственный оператор с тремя аргументами, что отражено в названии. Первый аргумент — это условие. Если оно истинно (равно true ), оператор вернёт второй аргумент — выражение1. В ином случае он вернёт третий аргумент — выражение2.
По сути оба фрагмента кода выполняют одно и то же действие — проверяют условие, а затем присваивают переменной первое или второе выражение в зависимости от истинности этого условия. Разница лишь в форме записи.
Варианты использования
Значение, возвращаемое тернарным оператором, можно записать в переменную — этот вариант мы уже рассмотрели в примере выше. Кроме этого, его можно использовать в функциях при возвращении значения с помощью return :
Также возможно использование множественных тернарных операций. В этом случае несколько операторов «?» будут идти подряд:
Что выбрать: тернарный оператор или if
При выборе за основной показатель нужно взять читабельность кода. Чем код понятнее, нагляднее, тем удобнее его рефакторить и поддерживать. Тернарный оператор может как сделать код проще, так и необоснованно его усложнить. Это зависит от ситуации.
Посмотрим ещё раз на самый первый вариант, уже разобранный выше. Здесь переменной присваивается значение в зависимости от условия, и это пример грамотного использования тернарного оператора. В таком случае он позволяет избавиться от громоздкой условной конструкции и сделать код проще и короче.
Но есть варианты, когда использование оператора усложняет код. В большинстве случаев это относится к множественным тернарным операциям, о которых речь шла выше. Ещё к таким вариантам стоит отнести использование тернарного оператора для выполнения целых фрагментов кода в зависимости от условия, а не простого присвоения значения переменной. Рассмотрим пример:
Тем не менее не стоит отказываться от тернарного оператора. Он может помочь сделать код понятным и лаконичным. Главное — знать, в каких конкретно ситуациях его полезно использовать, и не злоупотреблять.
Тернарный оператор в PHP
FullStack CTO
FullStack CTO
Шпаргалка
Я люблю краткие записи и часто пользуюсь тернарным оператором, особенно в PHP. Добавление новых 2х вариаций тернарного оператора, таких как:
добавили приятного удобства, с одной стороны. С другой — я сам лично периодически путаюсь в этих операторах и забываю какой как должен себя повести. Но так же я видел что некоторые отъявленные php-гуру задают вопросы на по этим операторам. Решил немного привести знания в порядок и структурировать их.
Тернарный оператор
И так, тернарный оператор в классическом виде это не что иное как:
Выглядит вроде бы просто и понятно (или нет?). И такое можно встретить не только на собеседовании, но и в работе. Вопрос — а каков результат?
Все дело в том, что тернарные выражения вычисляются слева направо. Поэтому эту запись более очевидно можно описать так:
Поэтому если увлекаетесь вложенными тернарными операторами (а я сам один из тех кто любит вложенные тернарные операторы) — то совет: обрамляйте логические блоки явно круглыми скобками, дабы не запутаться. Ну а если у вас корпоративная команда и вас очень много в проекте, то лучше и вовсе все писать явно длинно, используя классические блоки условий. Выглядит, как по мне, не так красиво, зато точно понятно.
Сокращенная запись тернарного оператора
Ранее часто в работе можно было видеть такие куски кода:
Дабы сократить дублирование кода было решено, что можно убирать дублирующую запись и с версии 5.3 можно стало писать так:
В целом удобно. И так, это всего лишь сокращенная запись тернарного оператора, подчиняющаяся всем правилам обычного тернарного оператора.
Вернемся к задачке с собеседования выше. Немного переформулируем ее так:
Что же в итоге будет в первом и втором варианте? Ну вы уже понимаете, что ответ 1го варианта: 1. Логично предположить, что раз короткая запись это эквивалент, то второй вариант будет тоже 1, да? Но это не точно…
В короткой нотации будет ответ true. Добавим скобок, чтобы было понятен процесс обработки:
Чтобы этого не было нужно было бы предварительно еще проверить наличие переменной или индекса. И вот чтобы это тоже сократить с версии 7 был добавлен null coalescing оператор.
Null coalescing оператор
Это еще одна разновидность тернарника, но с проверкой на существование (проверкой на null).
В принципе нечего тут объяснять, все просто и понятно. Запомнили и поехали дальше.
Наша задачка с модификациями:
Отработает так же как и в случае с короткой записью тернарного оператора.
Замечание
И на закуску еще одно важное замечание: все эти операторы трактуются как выражения, и их результат — это результат выражения. Это важно знать, если вы хотите вернуть переменную по ссылке: