Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб №4.Конструкции языка WEB-программирования....doc
Скачиваний:
9
Добавлен:
22.04.2019
Размер:
176.64 Кб
Скачать

7.Операция эквивалентности

В РНР версии 4 появился новый оператор сравнения — тройной знак равенства ===, или оператор проверки на эквивалентность. Как мы уже замечали ранее, РНР довольно терпимо относится к тому, что строки неявно преобразуются в числа, и наоборот. Например, следующий код выведет, что значения переменных равны:

$а=10;

$b="10";

if($a==$b) echo "а и b равны";

И это несмотря на то, что переменная, $а представляет собой число, а $b - строку.

Внимание.

$а=0; // ноль

$b=""; // пустая строка

if($a==$b) echo "а и b равны";

Хотя $а и $b явно не равны даже в обычном понимании этого слова, программа заявит, что они совпадают. Почему так происходит? Дело в том, что если один из операндов логического оператора может трактоваться как число, то оба операнда трактуются как числа. При этом пустая строка превращается в 0, который затем и сравнивается с нулем. Неудивительно, что оператор echo срабатывает.

Проблему решает оператор эквивалентности === (тройное равенство). Он не только сравнивает два выражения, но также их типы. Перепишем наш пример с использованием этого оператора:

Пример

$а=0; // ноль

$b=" "; // пустая строка

if($a===$b) echo "а и b равны";

Вот теперь ничего напечатано не будет. Но возможности оператора эквивалентности идут далеко за пределы сравнения "обычных" переменных. С его помощью можно сравнивать также и массивы, объекты и т. д. Это очень удобно. пример:

$а=аггау('а'=>'ааа');

$b=array('b'=>'bbb');

if ($a==$b) echo "С использованием == a=b<br>";

if ($a===$b) echo "С использованием === a=b<br>";

Если запустить представленный код, то выведется первое сообщение, но не второе. Произойдет это по той причине, что, как мы уже говорили, операнды-массивы преобразуются в строки Array, которые затем и будут сравниваться. Оператор === лишен этого недостатка, поэтому работает верно. Разумеется, для оператора === существует и его антипод — оператор !== (он состоит также из трех символов!).

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

Эти операции предназначены исключительно для работы с логическими выражениями и также возвращают false или true.

| а — истина, если, а ложно, и наоборот.

а && b — истина, если истинны и а, и b.

a | | b — истина, если истинны или а, или b, или они оба.

Следует заметить, что вычисление логических выражений, содержащих такие операции, идет всегда слева направо, при этом, если результат уже очевиден (например, false&&4 то—gо всегда дает false), то вычисления обрываются, даже если в выражении присутствуют вызовы функций. Например, в операторе

$logic = 0&&(time()>100);

стандартная функция time () никогда не будет вызвана.

Будьте осторожны с логическими операциями — не забывайте про удваивание символа. Обратите внимание, что, например, | и | | — два совершенно разных оператора, один из которых может потенциально возвращать любое число, а второй — только false и true.

Оператор отключения предупреждений

Выдаче ясных и адекватных сообщений о возникших во время выполнения сценария ошибках разработчики РНР заслуженно уделили особое внимание. Наверное, вы уже запускали несколько простых PHP-программ из браузера и имели удовольствие видеть, что все ошибки выводятся прямо в окно браузера вместе с указанием, на какой строке и в каком файле они обнаружены. Остается только в редакторе найти нужную строку и исправить ошибку. Весьма удобно!

Замечание

К сожалению, РНР — чуть ли не первый язык, который выводит предупреждения в браузер, а не в файлы журналов. Если вы работали некоторое время с таким языком, как Perl, то, наверное, уже успели устать от бесконечных верениц "500-х ошибок", которые Perl выдает при малейшей оплошности в сценарии. Теперь можете вздохнуть с облегчением: РНР никогда не выдаст сообщение о 500-й ошибке, что бы ни произошло. РНР устроен так, что ранжирует ошибки и предупреждения по четырем основным "уровням серьезности". Вы можете настроить его так, чтобы он выдавал только ошибки тех уровней, которые вас интересуют, игнорируя остальные (то есть, не выводя предупреждений о них). Рекомендуется всегда включать контроль ошибок no-максимуму, т. к. это может существенно упростить отладку программ. Допустим, мы так и поступили, и теперь РНР "ругается" даже на незначительные ошибки. Однако не всегда это бывает удобно. Более того, иногда предупреждения со стороны интерпретатора просто недопустимы. Рассмотрим, например, такой сценарий (листинг 3.4):

Листинг 3.4. Навязчивые предупреждения

<form action=test .php>

<input type=submit name="doGo" value="Click! ">

</form>

<?

if($doGo) echo "Вы нажали кнопку!";

Мы хотели сделать так, чтобы при нажатии на кнопку выдавалось соответствующее сообщение, но вот беда: теперь при первом запуске сценария РНР выдаст предупреждение о том, что "переменная $dodick не инициализирована". Ну не отключать же из-за такой мелочи контроль ошибок во всем сценарии, не правда ли? Как бы нам временно блокировать проверку ошибок, чтобы она не действовала только в одном месте, не влияя на остальной код?

Вот для этого и существует оператор @ (отключение ошибок). Если разместить данный оператор перед любым выражением (возможно, включающим вызовы функций, генерирующих предупреждения), то сообщения об ошибках в этом выражении будут подавлены и в окне браузера не отображены.

Замечание

На самом деле текст предупреждения сохраняется в переменной РНР

$php_errormsg, которая может быть в будущем проанализирована. Эта возможность доступна, если в настройках РНР включен параметр track_errors (по умолчанию он как раз и установлен в yes).

Вот теперь можно переписать предыдущий пример, грамотно отключив надоедливое предупреждение (листинг 3.5).

Листинг 3.5. Отключение навязчивого предупреждения

<form action=test .php>

<input type=submit name="doGo" value="Click! ">

</form>

<?

if(@$doGo) echo "Вы нажали кнопку!";

?>

Как можно заметить, листинг 7.5 отличается от листинга 7.4 всего лишь наличием оператора @ внутри скобок инструкции if .

Пример.

<?

$a=12;

echo @$a

?>

Теоретическая часть. Конструкции (инструкции) языка PHP.

Инструкция if-else

Начнем с самой простой инструкции — условного оператора. Ее формат

таков:

if(логическое_выражение)

инструкция_1;

else

инструкция_2;

Действие - следующее: если “логическое_выражение” истинно, то выполняется инструкция_1, а иначе — инструкция_2. Как и в любом другом языке, конструкция else может опускаться, в этом случае при получении должного значения просто ничего не делается.

Пример:

<?

$a=2010;

$b=2011;

if($a==$b)

{

echo "Переменные равны";

}

else

{

echo "Переменные НЕ равны!!";

}

?>

Задание. Напишите код программы, проверяющий две переменные на неравенство. Неравенство в PHP обозначается так: $x!=$y

Двойное (составное) условия If-Else

Пример

<?

$a=4;

$b=5;

$с=6;

$d=9;

if($a != $b and (&&) $c != $d)

{

echo "Переменные не равны";

}

else

{

echo "Переменные равны!!";

}

?>

Задание. Предлагается поэкспериментировать со знаками « < », « > », « >= », « <= »

Пример

<?

$a=1;

$b=2;

$с=7;

$d=7;

if($a != $b or (||) $c != $d)

{

echo "Переменные не равны";

}

else

{

echo "Переменные равны!!";

}

?>

Задание. Предлагается поэкспериментировать со знаками « < », « > », « >= », « <= »