Операции в PHP. Условные операторы Операторы сравнения в PHP

>> I have read a few of these responses and quite honestly didn"t find one that explained the differences between the "||" and "OR" operators.

The difference is explained in the link to on operator precedence.

The "||" operators are evaluated before assignment ("="), whereas the "or" operators are evaluated after the assignment. In your second example you are telling PHP to first assign the result of "(choice1 != false ? "hah" : "boo")" to $val, then "or" it against the rest of the statement. Try the example below and you will see what I mean (note the extra brackets to enforce precedence):

define ("choice1" , false );
define ("choice2" , "dog" );
define ("default1" , "other" );
$val = array();

$val [ "Test 1" ] = (choice1 != false ? "hah" : "boo" ) || (choice2 != false ? "hah2" : "boo2" ) || (default1 != false ? "hah3" : "boo3" );
$val [ "Test 1b" ] = ((choice1 != false ? "hah" : "boo" ) || (choice2 != false ? "hah2" : "boo2" ) || (default1 != false ? "hah3" : "boo3" ));
$val [ "Test 2" ] = (choice1 != false ? "hah" : "boo" ) or (choice2 != false ? "hah2" : "boo2" ) or (default1 != false ? "hah3" : "boo3" );
$val [ "Test 2b" ] = ((choice1 != false ? "hah" : "boo" ) or (choice2 != false ? "hah2" : "boo2" ) or (default1 != false ? "hah3" : "boo3" ));

Foreach ($val as $test => $result ) {
print ("$test: " ); var_dump ($result ); print "
\n
\n" ;
}
?>

test at hto dot com

Because the OR shorthand for an if block can produce more
readable code with less typing, it is tempting to produce functions that will return FALSE on failure or some other data type on success. Like mysql_connect, which "Returns a MySQL link identifier on success, or FALSE on failure."

The novice php php developer should avoid creating functions which might produce a FALSE on failure and an integer on success, if there is any chance that the integer might be zero.

blah blah blah ;
$i = give_me_liberty () or die("FATAL DB ERROR!" );
blah blah blah ;
?>

ironmo67 at yahoo dot com

Discovered a somewhat annoying different between PHP and Perl:


if (! some_function ()) return false ;
?>

cannot be rewritten as the prettier:

function some_function (){ return false ; }
some_function () or return false ;
?>

The following will work however:

function some_function (){ return false ; }
some_function () or die();
?>

Can you guess why? Simply, die() is a function and "return" is a statement (like the difference between print() and echo, sort of). This is really to bad because I find the if(!){} version tired and unreadable, but hey, it"s better than if (some_c_function == 0) { do something }.

A lot of the discussion below could have been avoided simply by being clear that &, | and ^ are *not* logical operators. That"s why they"re not listed on this page. They"re operators that act on the binary representations of numbers. They do not take logical values (i.e., "true" or "false") as arguments without first converting them to the numbers 1 and 0 respectively. Nor do they return logical values, but numbers. Sure, you can later treat those numbers as though they were logical values (in which case 0 is cast to "false" and anything else is cast to "true"), but that"s a consequence of PHP"s type casting rules, and nothing to do with the behaviour of the operators.

If you want logical operations, use logical operators; if you want bitwise operations, use bitwise operators ... using one for the other seems like a good way to make things difficult.

kws_ at hotpop dot com

"Just Because You Can, Doesn"t Mean You Should."

I also feel that circumventing short-circuit evaluation and relying on side-effects in conditional expressions is exercising bad style. Writing code that documents itself using clear and straightforward constructs strikes me as a much better practice than using a convoluted and difficult-to-read expression and explaining it with comments (or worse yet, not documenting it at all!) Indeed, source code should be written for the programmer"s eyes more so than the computer"s.

Utilizing the bitwise operators in a logical context could violates the expectations of the reader and may create confusion because bitwise operators imply bit-field operands.

I also feel that assuming that short-circuit evaluation is best for logical constructs IS within the compiler"s "rights", since when logical operators are used for their intended purpose, the assumptions that short-circuiting makes *ARE* logical, and do (once again, when used correctly) optimize evaluation of logical expressions.

It is not my intention to directly flame or insult any individual, but only to discourage the use of poor style and to encourage new (and even some experienced) programmers to write clear and verbose code, and to think about the programmers, rather than the computers that might end up trying to decipher your creations.

In answer to braintreno:

The second example you brought is the correct way to do it! It is not convoluted logic at all, it is what makes your code readable by not relying on obscure side effects!! It is much easier to read than the first one and it is by far easier to maintain.

For the idea to let a CheckThisOrOther() funtion echo information to the user alone, you should be stripped of your coding licence. If i ever had to maintain on of your scripts, I"d have to hate you.

This is not meant as flame bating as it might sound! Source code is not written for computers to execute, but for coders to read! Keep that at heart and your co-workers will thank you for it!

braintrino

Shadedecho"s post to force evaluation of both OR expression is actually exactly what should be done to suppress short-circuit optimization.

There are many occasions that you don"t want the compiler to short-circuit any evaluation, especially when you want to do an and/or situation. The short-circuit evaluation does an OR operation but not an AND/OR operation!!!

For instance, if I want the check the user"s query form to see if the user has missed answering any entry AND/OR if the user had duplicated the same answer for more than one entry, then I need to send the form back to the client informing what I want to be corrected.

Function SomeAnswersAreMissing()
{
...
echo "Oops! You missed answering some questions.";
return TRUE;
}

Function SomeAnswersAreDuplicated()
{
...
echo "Oops! You can answer both the same way.";
return TRUE;
}

If (SomeAnswersAreMissing() || SomeAnswersAreDuplicated())
SendFormAgain();

If I do that, the user will only see the missing answer warning but not the duplicated answer warning, even if both are true. This is not informative to the user because he/she will have to re-submit the form twice before he/she realized everything he/she did wrong, and frustrate the hack out of them. That is not user-friendly.

If (SomeAnswersAreMissing() | SomeAnswersAreDuplicated())
SendFormAgain();

Then both warning messages are sent at the same time, and the user can correct it in one re-send.

Thank shadedecho, I had been looking for a way to override the compiler"s stupid short-circuit optimization. The computer cannot just assume that short-circuiting is the best:(

BTW, of course you can do:

$you_made_a_mistake = false;

If (SomeAnswersAreMissing())

if (SomeAnswersAreDuplicated())
$you_made_a_mistake = true;

If ($you_made_a_mistake)
SendFormAgain();

But that is convoluted logic!!!

hop

Dear Newbie,

(as i don"t see such ideas creeping up in experienced programmers" minds...)

Please don"t pay attantion to shadedecho"s post from 14-Mar-2003 04:02! He is heavily relying on obscure side effects, which is not only very bad programming practice, but also does not achieve the optimization he thinks it is.

The proper way to make this


echo $a;
}

Work like shadedecho wants is (although the example as a whole is rather inapt):

$a .= blah();
$a .= blah2();

If ($a) { echo $a; }

If you read the discussion he links to you will find that he really wanted to get all distinct entries from two different db tables. Even there he is mistaken. The proper way to do this is to process the first table and then process the second table.
This is not only far more readable than the workaround with "|", it is also not the least slower.

shadedecho

It appears (after much frustrating but ultimately helpful searching and discussion on forums like tek-tips) that the
|| and the && are "short-circuited" as has been previously noted BUT the | and & operators (documented by PHP as bitwise operators) behave as their non-short-circuited counter-parts, respectively.

Function blah() {
echo "hello< br>";
return "from blah()< br>";
}

Function blah2() {
echo "world\< br>";
return "from blah2()< br>";
}

If (($a .= blah()) || ($a .= blah2())) {
echo $a;
}

This would result in the following output:

Hello
from blah()

Notice the "world" didn"t get echo"d and the "from blah2()" didn"t get concat"d into the $a variable, because the first assigment to $a was successful, so the "short-circuting" kicks in and the boolean test terminates without evaluating the rest of it.

HOWEVER, if you replace || with just | in that "if" statement, you get the output:

Hello
world
from blah()
from blah2()

Eureka! all parts of the boolean test are evaluated, in expected left-to-right fashion, and following all the normal precendence rules, so far as I can see.

This makes total sense... Using the bitwise operators, what is occurring is the bitwise-level operation on the result of two non-bitwise operations (the assignments). If a non-bitwise operation returns null (in other words, the value being assigned turns out to be null or 0), the bitwise operator would bind to that (or more appropriately, would "see" it) as a "0", otherwise it would see a non-zero (string of bits with at least one "1" in it).

Then a bitwise | is done on the two values, and if either is non-zero (has "1" bits in it) then the result will have those "1" bits in it (non-zero), and the if statement will interpret any non-zero value as true in a boolean test. Likewise, if both operands to the | were null or 0, then the result would be a zero value, which "if" would interpret as false.

The if statement above is doing a bitwise | on (in this case) two non-zero values (with "1"s in it at the bit level), so the | operation returns a non-zero value which is then reinterpreted by the if statement as TRUE!

So, in this special case where you are trying to string together non-short-circuited boolean tests, these operators work on their operands at the bitwise level, and since they are not comparison operators but mathematical operators, they can"t be short-circuited, and the resulting behavior is a non-short-circuited "boolean test".

I know, you must think I am crazy for trying to get around a built-in optimization like this, but I assure you there is a very good reason for it, and if you are interested, you can check out this thread as I have a very long post in there which explains what I was trying to do:

It is the 9th post down, where you will find my description of my database query"ing which i was wanting to optimize.

Which probably isn"t what you want.

This may be of aid to those who like their code to read like english, and might think that the precedence differences of these operators are relatively exotic: they aren"t.

As for me I ran into this problem because there is no symbolic logical XOR (for instance, no ^^) so I had to use XOR, and then figured that in similar places I"d ought to use AND and OR, and then my code broke:)

So now I"ve got to
$a = ($b xor $c);

Jesse Thompson
bend.com

yohgaki at hotmail dot com

In PHP4, "and", "or", "&&", "||" -- all are "short circuit" like in C/C++. In PHP3, I think it was not.

"Short circuit" means language stops evaluation of expression when conditions are determined. (Most language uses short circuit evaluation for logical condition)

$a = true;
$b = false;
if ($a || $b) {
}

This "if" statement only evaluate $a, since $a is true and whole condition must be true. (i.e. if $b is a function instead of value, the function will not be called)

muerte at web-ster dot com

I was hoping to find an operator similar to ||= functions in perl. My first thought would be:

$i = $i or "default"

But or doesn"t work like that. If you want to assign a default value to your variables only if they"re not already assigned you CAN however do:

$i or $i = "default"

The first example does NOT work because the or operator is not overloadable like it is in Perl.

dante at hearme dot com


I wanted to do something like this:

$choice1 = "";
$choice2 = "dog";
$default = "other";
$val = $choice1 || $choice2 || $default;

But then $val1 will only contain 1 or 0. Instead I did this:

$choice1 = "";
$choice2 = "dog";
$default = "other";
$val = $choice1 or $choice2 or $default;

Now $val contained the string "dog". That"s
weird that "or" is different from "||"...and I would
think that the "||" should be smart enough to handle
strings...the way PERL does. Guess not. Maybe it"s
a design choice.

На уроке будут рассмотрены условные операторы php: оператор if и оператор переключения switch

Условные операторы php представлены тремя основными конструкциями:

  • оператор условия if ,
  • оператор переключения switch
  • и тернарный оператор .

Рассмотрим подробнее каждый из них.

PHP оператор if

Рис 3.1. Условный оператор IF, укороченный вариант


Рис. 3.2. Синтаксис условного оператора IF ELSE


Рис. 3.3. Полный синтаксис условного оператора IF elseif

Подытожим:

Полный синтаксис:

if (условие) { // если условие истинно operator1; operator2; } elseif(условие) { operator1; ... } else { // если условие ложно operator1; operator2; }

  • Укороченный синтаксис может не содержать части конструкции с else и не содержать дополнительного условия elseif
  • Вместо служебного слова elseif можно писать else if (отдельно)
  • В одной конструкции if может быть несколько elseif . Будет выполнено первое встретившееся выражение elseif равное TRUE .
  • В случае наличия альтернативного условия elseif конструкция else должна идти последней в синтаксисе.

В условном операторе может использоваться двоеточие: вместо фигурных скобок. В таком случае заканчивается оператор служебным словом endif

Рис. 3.4. Условный оператор If и Endif в php

Пример:

if($x > $y): echo $x." больше, чем ".$y; elseif($x == $y): // при использовании ":" нельзя писать раздельно else if echo $x." равно ".$y; else: echo $x." не > и не = ".$y; endif;

Важно: При использовании в конструкции двоеточия вместо фигурных скобок elseif нельзя писать в два слова!

Логические операции в условии

В условии if в скобках могут присутствовать следующие операции:

Пример: проверить значение числовой переменной: если оно меньше либо равно 10, — выдавать сообщение «число меньше или равно 10» , в обратном случае выдавать сообщение «число больше 10»


Решение:

$number=15; if ($number <=10) { echo "число меньше или равно 10"; } else { echo "число больше 10"; }

Блоки php кода можно разрывать, рассмотрим пример:

Пример: Выводить на экран html-код «а равно 4» , если переменная $a действительно равна 4


1 Решение:
1 2 3 4

2 Решение:

1 2 3 A равно 4

A равно 4

Задание php 3_1: Выводить перевод цветов с английского языка на русский, проверяя значение переменной (в которой присвоен цвет: $a="blue")


Задание php 3_2: Найти максимальное из трех чисел

Операции сравнения и правило лжи

В конструкции if в скобках должно находиться логическое выражение или переменная, которые рассматриваются с точки зрения алгебры логики, возвращающая значения либо true либо false

Т.е. в качестве условия может выступать единственная переменная. Рассмотрим пример:

1 2 3 4 $a = 1 ; if ($a ) { echo $a ; }

$a=1; if ($a) { echo $a; }

В примере транслятор языка php будет рассматривать переменную в скобках на правило лжи:

Правило ЛЖИ или что считается ложным:

  • логическое False
  • целый ноль (0 )
  • действительный ноль (0.0 )
  • пустая строка и строка «0»
  • массив без элементов
  • объект без переменных
  • специальный тип NULL

Таким образом, в рассмотренном примере переменная $a равна единице, соответственно условие будет истинным и оператор echo $a; выведет на экран значение переменной.

Задание php 3_3: дана переменная а со строковым значением. Если а равна имени, то выводить «Привет, имя!» , если а равна пустому значению, то выводить «Привет, незнакомец!»

Логические конструкции И ИЛИ и НЕ в условном операторе

  1. Иногда необходимо предусмотреть выполнение одновременно нескольких условий. Тогда условия соединяются логическим оператором И — && :
  2. $a=1; if ($a>0 || $a>1) { echo "a > 0 или a > 1"; }

  3. Для указания ложности условия используется логический оператор НЕ — ! :
  4. 1 2 3 4 $a = 1 ; if (! ($a < 0 ) ) { echo "a не < 0" ; }

    $a=1; if (!($a<0)) { echo "a не < 0"; }

Оператор Switch PHP

Оператор switch или «переключатель» заменяет несколько подряд идущих конструкций if . При этом он сравнивает одну переменную с множеством значений. Таким образом, это наиболее удобное средство для организации мультиветвления .

Синтаксис:

1 2 3 4 5 6 7 8 9 10 switch ($переменная ) { case "значение1" : оператор1 ; break ; case "значение2" : оператор2 ; break ; case "значение3" : оператор3 ; break ; [ default : оператор4 ; break ; ] }

switch($переменная){ case "значение1": оператор1; break; case "значение2": оператор2; break; case "значение3": оператор3; break; }

  • Оператор может проверять как строковые значения (тогда они указываются в кавычках), так и числовые (без кавычек).
  • Оператор break в конструкции обязателен. Он осуществляет выход из конструкции при истинном условии и выполнении соответствующего условию оператора. Без break будут выполняться операторы всех case независимо от их истинности.

Рис. 3.5. Условный оператор Switch


Пример: задан массив с полными мужскими именами. Проверять первый элемент массива и в зависимости от имени, выдавать приветствие с коротким именем.


Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $names = array ("Иван" , "Петр" , "Семен" ) ; switch ($names [ 0 ] ) { case "Петр" : echo "Привет, Петя!" ; break ; case "Иван" : echo "Привет, Ваня!" ; break ; case "Семен" : echo "Привет, Ваня!" ; break ; default : echo "Привет, $names !" ; break ; }

$names=array("Иван","Петр","Семен"); switch($names){ case "Петр": echo "Привет, Петя!"; break; case "Иван": echo "Привет, Ваня!"; break; case "Семен": echo "Привет, Ваня!"; break; default: echo "Привет, $names!"; break; }

Задание php 3_4:

  • Создайте переменную $day и присвойте ей произвольное числовое значение
  • С помощью конструкции switch выведите фразу «Это рабочий день» , если значение переменной $day попадает в диапазон чисел от 1 до 5 (включительно)
  • Выведите фразу «Это выходной день» , если значение переменной $day равно числам 6 или 7
  • Выведите фразу «Неизвестный день» , если значение переменной $day не попадает в диапазон чисел от 1 до 7(включительно)

Дополните код:

1 2 3 4 5 6 7 8 9 10 11 12 ... switch (... ) { case 1 : case 2 : ... echo "Это рабочий день" ; break ; case 6 : ... default : ... }

Switch(...){ case 1: case 2: ... echo "Это рабочий день"; break; case 6: ... default: ... }

Тернарный оператор PHP

Тернарный оператор , т.е. с тремя операндами, имеет достаточно простой синтаксис, в котором слева от знака? записывается условие, а справа — два оператора разделенные знаком: , слева от знака выполняется оператор при истинности условия, а справа от знака: выполняется оператор при ложном условии.

условие? оператор1 : оператор2 ;

Последнее обновление: 1.11.2015

В PHP мы можем использовать различные операторы: арифметические, логические и т.д. Рассмотрим каждый тип операций.

Арифметические операции

    + (операция сложения)

    Например, $a + 5

    - (операция вычитания)

    Например, $a - 5

    * (умножение)

    Например, $a * 5

    / (деление)

    Например, $a / 5

    % (получение остатка от деления)

    Например: $a=12; echo $a % 5; // равно 2

    ++ (инкремент/ увеличение значения на единицу)

    Например, ++$a

    Важно понимать разницу между выражениями ++$a и $a++ . Например:

    $a=12; $b=++$a; // $b равно 13 echo $b;

    Здесь сначала к значению переменной $a прибавляется единица, а затем ее значение приравнивается переменной $b. Иначе было бы, если бы выражение выглядело так: $b=$a++; . Здесь сначала значение переменной $a приравнивалось переменной $b, а затем происходило увеличение значения переменной $a.

    -- (декремент/ уменьшение значения на единицу)

    Например, --$a . И также, как и в случае с инкрементом, существуют два вида записи: --$a и $a--

Операции присваивания

    Приравнивает переменной определенное значение: $a = 5

    Сложение с последующим присвоением результата. Например: $a=12; $a += 5; echo $a; // равно 17

    Вычитание с последующим присвоением результата. Например: $a=12; $a -= 5; echo $a; // равно 7

    Умножение с последующим присвоением результата: $a=12; $a *= 5; echo $a; // равно 60

    Деление с последующим присвоением результата: $a=12; $a /= 5; echo $a; // равно 2.4

    Объединение строк с присвоением результата. Применяется к двум строкам. Если же переменные хранят не строки, а, к примеру, числа, то их значения преобразуются в строки и затем проводится операция: $a=12; $a .= 5; echo $a; // равно 125 // идентично $b="12"; $b .="5"; // равно 125

    Получение остатка от деления с последующим присвоением результата: $a=12; $a %= 5; echo $a; // равно 2

Операции сравнения

Операции сравнения, как правило, применяются в условных конструкциях, когда надо сравнивать два значения, и в зависимости от результата сравнения выполнить некоторые действия. Имеются следующие операции сравнения.

    Оператор равенства сравнивает два значения, и если они равны, возвращает true, иначе возвращает false: $a == 5

    Оператор тождественности также сравнивает два значения, и если они равны, возвращает true, иначе возвращает false: $a === 5

    Сравнивает два значения, и если они не равны, возвращает true, иначе возвращает false: $a != 5

    Сравнивает два значения, и если они не равны, возвращает true, иначе возвращает false: $a !== 5

    Сравнивает два значения, и если первое больше второго, то возвращает true, иначе возвращает false: $a > 5

    Сравнивает два значения, и если первое меньше второго, то возвращает true, иначе возвращает false: $a < 5

    Сравнивает два значения, и если первое больше или равно второму, то возвращает true, иначе возвращает false: $a >= 5

    Сравнивает два значения, и если первое меньше или равно второму, то возвращает true, иначе возвращает false: $a <= 5

Оператор равенства и тождественности

Оба оператора сравнивают два выражения и возвращают true, если выражения равны. Но между ними есть различия. Если в операции равенства принимают два значения разных типов, то они приводятся к одному - тому, который интерпретатор найдет оптимальным. Например:

Очевидно, что переменные хранят разные значения разных типов. Но при сравнении они будут приводится к одному типу - числовому. И переменная $a будет приведена к числу 22. И в итоге обе переменных окажутся равны.

Или, например, следующие переменные также будут равны:

$a = false; $b = 0;

Чтобы избежать подобных ситуаций используется операция эквивалентности, которая учитывает не только значение, но и тип переменной:

$a = "22a"; $b = 22; if($a===$b) echo "равны"; else echo "не равны";

Теперь переменные будут не равны.

Аналогично работают операторы неравенства!= и!== .

Логические операции

Логические операции обычно применяются для объединения результатов двух операций сравнения. Например, нам надо выполнить определенное действие, если истинны будут несколько условий. Имеются следующие логические операции:

    Возвращает true, если обе операции сравнения возвращают true, иначе возвращает false: $a == 5 && $b = 6

    Аналогично операции && : $a == 5 and $b > 6

    Возвращает true, если хотя бы одна операция сравнения возвращают true, иначе возвращает false: $a == 5 || $b = 6

    Аналогично операции || : $a < 5 or $b > 6

    Возвращает true, если операция сравнения возвращает false: !($a >= 5)

    Возвращает true, если только одно из значений равно true. Если оба равны true или ни одно из них не равно true, возвращает false. Например: $a=12; $b=6; if($a xor $b) echo "true"; else echo "false";

    Здесь результат логической операции будет false , так как обе переменных имеют определенное значение. Изменим код:

    $a=12; $b=NULL; if($a xor $b) echo "true"; else echo "false";

    Здесь уже результат будет true , так как значение одной переменной не установлено. Если переменная имеет значение NULL, то в логических операциях ее значение будет рассматриваться как false

Битовые операции

Битовые операции производятся над отдельными битами числа. Числа рассматриваются в двоичном представлении, например, 2 в двоичном представлении 010, число 7 - 111.

    & (логическое умножение)

    Умножение производится поразрядно, и если у обоих операндов значения разрядов равно 1, то операция возвращает 1, иначе возвращается число 0. Например: $a1 = 4; //100 $b1 = 5; //101 echo $a1 & $b1; // равно 4

    Здесь число 4 в двоичной системе равно 100, а число 5 равно 101. Поразрядно умножим числа и получим (1*1, 0*0, 0 *1) = 100, то есть число 4 в десятичном формате.

    | (логическое сложение)

    Похоже на логическое умножение, операция также производится по двоичным разрядам, но теперь возвращается единица, если хотя бы у одного числа в данном разряде имеется единица. Например: $a1 = 4; //100 $b1 = 5; //101 echo $a1 | $b1; // равно 5

    ~ (логическое отрицание)

    инвертирует все разряды: если значение разряда равно 1, то оно становится равным нулю, и наоборот. $b = 5; echo ~$b;

    x<

    x>>y - сдвигает число x вправо на y разрядов. Например, 16>>1 сдвигает число 16 (которое в двоичном представлении 10000) на один разряд вправо, то есть в итоге получается 1000 или число 8 в десятичном представлении

Объединение строк

Для объединения строк используется оператор "точка". Например, соединим несколько строк:

$a="Привет, "; $b=" мир"; echo $a . $b . "!";

Если переменные представляют не строки, а другие типы, например, числа, то их значения преобразуются в строки и затем также происходит операция объединения строк.

Итак, мы уже умеем выполнять код, соответствующий определённому условию. Но до этого момента условие могло быть только одно. А что если код должен выполняться при соблюдении сразу нескольких условий?

Для решения этой задачи существуют логические операторы:

= 5 && $price <= 10) echo "Это число находится между 5 и 10"; ?>

Оператор && , который ещё называется логическое И , приводит значения слева и справа к булеву типу, а затем и сам возвращает булево значение: true если слева и справа true , либо false если одно из условий false .

Другими словами, если и одно, и другое условие истинно, то и оператор && возвращает истину. Что и отражает название оператора.

Оператор || или логическое ИЛИ возвращает истину, когда истинно хотя бы одно из двух условий:

5 || 1 > 2) echo "Условие выполнено."; ?>

В коде выше команда echo будет выполнена, поскольку одно из условий истинно.

Все логические операторы в PHP

Между операторами && и and , а также между || и or есть небольшое различие - порядок выполнения.

Как вы знаете, умножение имеет больший приоритет, чем сложение. Так вот, операторы and и or имеют приоритет ниже, чем оператор присваивания = . Результат можно увидеть в следующем примере:

Странно, да? Поскольку у = приоритет выше, PHP воспримет код так:

($var = true) and false;

Т.е. сначала он присваивает переменной $var значение true , а затем происходит операция true and false , которая не имеет смысла, поскольку не влияет на значение переменной.

Ниже расположена таблица с приоритетами операторов. С некоторыми из них вы уже встречались. Чем выше оператор в таблице - тем выше его приоритет.

  • ++ -- ~ (int) (float) (string) (array) (object) (bool) @
  • * / %
  • + - .
  • < <= > >=
  • == != === !== <> <=>
  • ? : (тернарный оператор)
  • = += -= *= **= /= .= %= &= |= ^= <<= >>=

Теперь мы можем определить, что приоритет операторов сравнения (==, != и т.д.) выше, чем у логических операторов. Эта информация пригодится нам для выполнения задачи.


Главное в действие данное оператора - это условие. if в переводе с английского значит если . Условие принимается в качестве аргумента (то что в скобках). В качестве условия может выступать логическое выражение или логическая переменная. Если проще, то смысл выражения будет такой:

If (условие){
условие выполнено, делаем так
}
else
{
условие не выполнено, делаем иначе
}
Надеюсь логика условной операции понятна. Теперь давайте рассмотрим пример.

$a = 5;
$b = 25;

// Теперь внимание! Условие: Если $b больше $a
// Знаки > и < , как и в математике, обозначают больше и меньше
if($b > $a)
{
// если условие выполнено, то выполняем это действие
echo "$b больше $a";
}
else
{
// если не выполнено, то это
echo "$a больше или равно $b";
}
?>
Демонстрация Скачать исходники
В итоге скрипт выведет 25 больше 5 . Пример довольно прост. Надеюсь всё понятно. Теперь предлагаю рассмотреть ситуацию сложнее, где нужно соблюсти несколько условий. Каждое новое условие будет содержать после основного условия if() - вспомогательное, которое записывается как else if() . В конце как обычно будет else .

Задача: В школе проводят тестирование. Скрипту нужно высчитать балл, зная условия получения каждой оценки и сам балл школьника. Давайте посмотрим как это записать, и не забудьте прочитать комментарий.

$test = 82; // допустим школьник написал тест на 82 балла

// первое условие напишем для пятёрки
if($test > 90)
{
// если условие соблюдено, то выполняем это действие.
echo "Оценка 5";
}
// Знак && обозначает "и, объединение", что условие соблюдено если и то, и то верно
// то есть балл меньше 91 и больше 80, тогда 4. Иначе условия считываются дальше
else if ($test < 91 && $test > 80)
{
echo "Оценка 4";
}
else if ($test < 81 && $test > 70)
{
echo "Оценка 3";
}
else
{
echo "Надо бы ещё раз написать тест...";
}
?>
Демонстрация Скачать исходники
Наш школьник, который успевает и отдохнуть, и написать нормально тест получает оценку 4 ! А принцип работы надеюсь понятен.

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

$age = 19; // переменная с возрастом

If ($age > 17){
echo "Всё! Мне можно делать всё что угодно! Мне уже $age!";
}
Вполне себе милый пример короткой записи условной операции. else писать не обязательно.

Операторы сравнения в PHP

Принцип работы условной операции понятен. Но, как Вы понимаете, способов сравнить намного больше. Давайте посмотрим ниже на таблицу с операторами сравнения.

Пример Название Результат
$a == $b Равно True, если $a равно $b
$a === $b Идентично True, если $a равно $b и обе переменных принадлежат одному типу
$a != $b Не равно True, если $a не равно $b
$a === $b Не идентично True, если $a не равно $b и оба их типа не совпадают
$a > $b Больше чем True, если $a больше, чем $b
$a < $b Меньше чем True, если $a меньше, чем $b
$a >= $b Больше или равно True, если $a больше или равно $b
$a <= $b Меньше или равно True, если $a меньше или равно $b
Теперь рассмотрим операторы на примерах :

// вопреки привычке = значит присваивание значение переменной, а == как равно
if ($a == 5){
echo "$a равно 5"; // выведет "5 равно 5"
} else {
echo "$a не равно 5";
}

If ($a != 6){
echo "$a не равно 6"; // выведет "5 не равно 6". Нужно в случае отрицания
} else {
echo "$a каким-то образом равно 6";
}

// с больше и меньше думаю всё понятно. Поэтому пример сложнее
if ($a <= 6){
echo "$a меньше или равно 6"; // выведет "5 меньше или равно 6"
} else {
echo "$a больше 6";
}

Логические операторы PHP

Бывают случаи, когда нужно сравнить не одну переменную, а сразу две и более в одном условии. Для этого существуют логические операторы .

Пример Название Результат
$a and $b Логическое "и" TRUE если и $a, и $b TRUE.
$a or $b Логическое "или" TRUE если или $a, или $b TRUE.
$a xor $b Исключающее "или" TRUE если $a, или $b TRUE, но не оба.
! $a Отрицание TRUE если $a не TRUE.
$a && $b Логическое "и" TRUE если и $a, и $b TRUE.
$a || $b Логическое "или" TRUE если или $a, или $b TRUE.
Уже обратили внимание, что для операций и и или есть дополнительные операторы? Так сделано для того, чтобы расставить приоритеты в сложных операциях сравнения. В таблице логические операторы приведены в порядке приоритета: от меньшего к большему, то есть, например, || имеет больший приоритет, чем or.

Переходим к примерам

$a = 5;
$b = 6;
$c = 7;

// условие: Если 5 не равно 6 (ВЕРНО) И 6 не равно 7 (ВЕРНО)
if ($a < 6 && $b != $c){
echo "Действительно так!"; // выведет "Действительно так!" т.к. ОБА условия ВЕРНЫ
} else {
echo "Одно из условий не верно";
}

// условие: Если 6 не равно 6 (НЕВЕРНО) ИЛИ 6 не равно 7 (ВЕРНО)
if ($b != 6 || $b != $c){
echo "Всё так!"; // выведет "Всё так!", т.к. хотя бы ОДНО из условий ВЕРНО
} else {
echo "Оба условия не верны";
}

Тернарный оператор

К вопросу тернарного кода я предлагаю Вам вернуться позже. Вовсе не упомянуть его я не мог, так как это важная конструкция, которая существенно сокращает размер кода. Предлагаю сразу рассмотреть код.

Суть кода: (условие) ? значение a если true: значение a если false

Таким образом, мы сокращаем запись оператора if. Однако, данная операция действительна только с присваиванием значений переменной. Теперь давайте рассмотрим готовый пример.

// Пример использования тернарного оператора
$settings = (empty($_POST["settings"])) ? "По умолчанию" : $_POST["settings"];

// Приведенный выше код аналогичен следующему блоку с использованием if/else
if (empty($_POST["settings"])) {
$settings = "По умолчанию"; // Если ничего не передано, то оставляем "По умолчанию"
} else {
$settings = $_POST["settings"]; // Если передано, то $settings присваивается переданное значение.
}
?>
Прочитайте комментарии к коду и всё должно быть понятно.

Спасибо за внимание!