Лекция 6

Общее знакомство с PHP. Переменные и их типы. Операторы. Управляющие конструкции.

1. Общее знакомство с PHP

Язык РНР кажется знакомым программистам, работающим в разных областях. Многие конструкции языка позаимствованы из Си Perl.

Рассмотрим процесс выполнения php-сценария при обращении браузера к серверу. Итак, вначале браузер запрашивает страницу с расширением. php, после чего web-сервер пропускает программу через машину PHP и выдаёт результат в виде html-кода. Причем, если взять стандартную страницу HTML, изменить расширение на. php и пропустить её через машину PHP, последняя просто перешлёт её пользователю без изменений. Чтобы включить в этот файл команды PHP, необходимо заключить команды PHP в специальные теги, которых различают несколько видов. Рассмотрим два из них.

1) Стандартные теги используются программистами РНР чаще остальных способов, что объясняется наглядностью и удобством этой формы записи:

<?php print "Welcome to the world of PHP!": ?>

2) Короткие теги обеспечивают наиболее компактную запись для перехода в РНР:

<? print "Welcome to the world of PHP!"; ?>

По умолчанию короткие теги не используются, их нужно специально активизировать. Это можно сделать, включив параметр short_open_tag в файл php. ini.

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

<?

  if (5>3){

?>

  <p>Hello!</p>

НЕ нашли? Не то? Что вы ищете?

<?

  }

?>

Комментарии в коде РНР

В РНР существуют два формата комментариев:

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

Многострочные комментарии обычно используются при оформлении алгоритмов на псевдокоде и в более подробных объяснениях.

При оформлении однострочных комментариев используется два стиля комментирования. Оба стиля работают абсолютно одинаково, но в них используются разные служебные символы. В одном случае комментарий начинается с двойного символа «косая черта» (//), а в другом — с символа фунта (#).

В РНР существует возможность построения подробных комментариев, занимающих несколько строк. Такие комментарии оформляются в стиле языка С — их начало и конец обозначаются символами /* и */.

Следует помнить о том, что стили комментариев PHP действуют только внутри ограничителей PHP. Если PHP встретит эти символы комментариев вне ограничителей, то они, как и любой текст, будут помещены на html-страницу

2. Переменные и типы данных

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

целые числа;

вещественные числа;

строки;

массивы;

объекты;

логические величины.

Целые числа. В РНР поддерживается запись целых чисел в восьмеричной (по основанию 8) и шестнадцатеричной (по основанию 16) системах счисления. Восьмеричные числа начинаются с цифры 0, после которой следует серия цифр от 0 до 7. Примеры: 0422, 0534

Шестнадцатеричные целые числа имеют префикс 0х или 0Х и могут состоять из цифр от 0 до 9 и букв от а (А) до f (F). Примеры: 0x3FF, 0x22abc

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

Строкой  называется последовательность символов, которая рассматривается как единое целое, но при этом обеспечивает доступ к отдельным символам. Примеры строк: thesaurus, 49ers, abc. Строки делятся на две категории в зависимости от типа ограничителя — они могут ограничиваться парой кавычек (" ") или апострофов (' '). Между этими категориями существуют два принципиальных различия. Во-первых, имена переменных в строках, заключенных в кавычки, заменяются соответствующими значениями, а строки в апострофах интерпретируются буквально, даже если в них присутствуют имена переменных,

Два следующих объявления дают одинаковый результат:

$team = "Real";

$team = 'Real';

Однако результаты следующих объявлений сильно различаются:

$s1 = "My favorite team is $team";

$s2 = 'My favorite team is $team';

Переменной $s1 присваивается строка

My favorite team is Real.

Переменной $s2 присваивается строка

My favorite team is $team.

К отдельным символам строки можно обращаться как к элементам массива с последовательной нумерацией (см. следующий раздел). Пример:

$sequence = "04efgh";

$letter = $sequence[4];

Переменной $ letter будет присвоено значение g. В РНР нумерация элементов массивов начинается с 0.

Массивы. Массив представляет собой список однотипных элементов. Существует два типа массивов, различающиеся по способу идентификации элементов. В массивах первого типа элемент определяется индексом в последовательности. Массивы второго типа имеют ассоциативную природу, и для обращения к элементам используются ключи, логически связанные со значениями. Впрочем, на практике операции с массивами обоих типов выполняются сходным образом. По размерности массивы делятся на одномерные и многомерные.

Обобщенный синтаксис элементов одномерного массива:

$имя[индекс1];

Одномерные массивы создаются следующим образом:

$meat[0] = "chicken";

$meat[l] = "steak";

$meat[2] = "turkey";

При выполнении следующей команды:

print $meat[1]:

в браузере выводится строка

steak

При создании массивов также можно воспользоваться функцией array (). Массив $meat из предыдущего примера создается командой

$meat = аrrау("chicken", "steak", "turkey");

Приведенная выше команда print приводит к тому же результату — выводу строки steak.

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

$meat[] = "chicken";

$meat[] = "steak";

$meat[] = "turkey";

Ассоциативные массивы особенно удобны в ситуациях, когда элементы массива удобнее связывать со словами, а не с числами.

Предположим, вы хотите сохранить в массиве сочетания месяцев и соответствующих им времен года. Проще всего было бы хранить в массиве пары «ключ/значение» :

$mes ["january"] = "Winter";

$mes["february"] = "Winter";

$mes["march"] = "Spring";

$mes["june"] = "Summer";

Ассоциативный массив заметно экономит время и объем программного кода, необходимого для вывода определенных элементов массива. Допустим, вы хотите узнать, к какому времени года относится июнь. Нужная информация выводится простой ссылкой на элемент массива

print $mes ["june"];

В названии ключа допускается использование произвольных символов.

Ассоциативные массивы также можно создавать функцией РНР аггау():

Spairings = аrrау(

january=> "Winter",

february => "Winter",

march => "Spring",

june => "Summer");

Многомерные индексируемые массивы работают практически так же, как и их одномерные прототипы, однако элементы в них определяются несколькими индексами вместо одного. Теоретически размерность индексируемого массива не ограничивается, хотя в большинстве приложений практически не встречаются массивы с размерностью выше 3.

Обобщенный синтаксис элементов многомерного массива:

$имя[индекс1][индекс2]..[индексN];

Пример ссылки на элемент двухмерного индексируемого массива:

$position = $chess_board[5][4];

Аналогично работают и многомерные ассоциативные массивы.


Логические величины

Логический тип данных принимает всего два значения: истинное (true) и ложное (false). Логические величины создаются двумя способами: при проверке условий и в виде значений переменных. Обе ситуации достаточно просты.

Сравнения существуют в нескольких формах. Чаще всего они встречаются при использовании оператора = в условной команде if. Пример:

if ($sum == 40) :

...

Результатом проверки является либо истина, либо ложь: переменная $sum либо равна 40, либо не равна. Если переменная $sum равна 40, проверка дает истинный результат. В противном случае результат равен false.

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

$flag = TRUE;

if ($flag == TRUE) :

print "The flag is true!";

else :

print "The flag is false!";

endif;

Если переменная $flag истинна, выводится первое сообщение, а если ложна — второе сообщение.

Возможен и другой вариант — представление истинных и ложных логических величин в виде значений 1 и 0 соответственно

Идентификаторы

Общий термин идентификатор применяется к переменным, функциям и другим объектам, определяемым пользователем. Идентификаторы РНР должны удовлетворять нескольким условиям:

Идентификатор состоит из одного или нескольких символов и начинается с буквы или символа подчеркивания. Идентификатор может содержать только буквы, цифры, символы подчеркивания и другие ASCII-символы с кодами от 127 до 255. Примеры:

В идентификаторах учитывается регистр символов. Следовательно, переменная с именем $recipe отличается от переменных с именами $Recipe, $rEciPe и $recipE.

Длина идентификаторов не ограничивается. Это удобно, поскольку программист может точно описать смысл идентификатора в его имени.

Идентификатор не может совпадать с каким-либо из стандартных ключевых слов РНР.


Переменные

Имена переменных всегда начинаются со знака доллара $. Ниже приведены примеры допустимых имен переменных:

$соlоr

$operating_system

$_some_variable

$model

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

$sentence = "This is a sentence."; // $sentence интерпретируется как строка

$price = 42.99: // $price интерпретируется как вещественное число

$weight = 185; // $weight интерпретируется как целое число

Присваивание

Присваивание по значению

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

$vehicle = "car";

$amount =10.23;

Переменные в переменных

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

$day = "monday";

Оказывается, строку "monday" можно интерпретировать как имя переменной — для этого в команде присваивания перед именем исходной переменной ставится второй знак $:

$$day = “&new”;

Эта команда присваивает строку "&new" переменной с именем "monday". Следовательно, следующие две команды выводят одинаковые результаты:

print $day $monday;

print $day $($day);

В обоих случаях будет выведена строка "monday&new".

Преобразование типов

Есть функция gettype(), возвращающая тип, который РНР назначил переменной:

<?

  $var = "5";

  $var1 = 5;

  echo(gettype($var));

  echo "<br>";

  echo(gettype($var1));

?>

В первом случае РНР вернет string, во втором integer.

Существует также функция settype(), которая явно устанавливает тип:

<?

  $var = "5";

  echo(gettype($var));

  settype($var, integer);

  echo "<br>";

  echo(gettype($var));

?>

Выполнение этого фрагмента кода приведет к такому же результату, как и предыдущего.

Кроме функции settype() преобразование типов в РНР можно осуществлять при помощи операторов преобразования типов. Преобразование типов осуществляется путем указания перед переменной ее нового типа, взятого в скобки:

$var = (int)$var;

Соответственно, выполнение следующего кода приведет к тому, что РНР вернет integer:

<?

  $var = "5"; // тип string

  $var = (int)$var; // преобразуем в int

  echo(gettype($var));

?>

Константы

Константы объявляются в РНР при помощи функции define():

define(CONSTANT, value)

Первый параметр этой функции – имя константы, второй – её значение. При использовании константы на неё ссылаются по имени:

<?

  define(CONSTANT1,15);

  define(CONSTANT2,"Hello");

  echo(CONSTANT1);

  echo(CONSTANT2);

?>

По традиции имена констант пишут буквами верхнего регистра. Существует функция defined(), которая проверяет, определена ли константа:

<?

  define(CONSTANT,"Hello");

  if(defined("CONSTANT"))

  {

  echo("<p>CONSTANT is defined</p>");

  }

?>

3. Операторы

Математические операторы

Математические операторы предназначены для выполнения различных математических операций и часто применяются в большинстве программ РНР.

Пример

Название

Результат

$а + $b

Сложение

Сумма $а и $b

$а-$b

Вычитание

Разность $а и $b

$а*$b

Умножение

Произведение $а и $b

$а/$b

Деление

Частное от деления $а на $b

$а % $b

Остаток

Остаток от деления $а на $b


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

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

Пример

Название

Результат

$а = 5;

Присваивание

Переменная $а равна 5

$а += 5;

Сложение с присваиванием

Переменная $а равна сумме $а и 5

$а *= 5;

Умножение с присваиванием

Переменная $а равна произведению $а и 5

$а/=5;

Деление с присваиванием

Переменная $а равна частному отделения $а на 5

$а.= 5;

Конкатенация с присваиванием

Переменная $а равна конкатенации $а и 5

Умеренное использование операторов присваивания обеспечивает более наглядный и компактный код.

Строковые операторы

Строковые операторы РНР обеспечивают удобные средства конкатенации (то есть слияния) строк. Существует два строковых оператора: оператор конкатенации (.) и оператор конкатенации с присваиванием (.=), описанный в предыдущем разделе «Операторы присваивания».

Конкатенацией называется объединение двух и более объектов в единое целое.


Пример

Название

Результат

$a = "abc"."def"

Конкатенация

abcdef

$а.= "ghijkl"

Конкатенация с присваиванием

abcdefghijkl


Операторы инкремента и декремента

Удобные вспомогательные операторы инкремента (++) и декремента (--) делают программу более наглядной и обеспечивают укороченную запись для увеличения или уменьшения текущего значения переменной на 1.

Пример

Название

Результат

++$а, $а++

Инкремент

Переменная $а увеличивается на 1

--$а, $а--

Декремент

Переменная $а уменьшается на 1


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

Логические операторы наряду с математическими операторами играют важную роль в любом приложении РНР, обеспечивая средства для принятия решений в зависимости от значения переменных. Логические операторы позволяют управлять порядком выполнения команд в программе и часто используются в управляющих конструкциях (таких, как условная команда i f, а также циклы for и while).

Пример

Название

Результат

$а && $b

Конъюнкция

Истина, если истинны оба операнда,

$aAND$b

Конъюнкция

Истина, если истинны оба операнда

$а|| $b

Дизъюнкция

Истина, если истинен хотя бы один из операндов

$а OR $b

Дизъюнкция

Истина, если истинен хотя бы один из операндов

!$а

Отрицание

Истина, если значение $а ложно

NOT $a

Отрицание

Истина, если значение $а ложно

$а XOR $b

Исключающая дизъюнкция

Истина, если истинен только один из операндов


Операторы равенства

Операторы равенства предназначены для сравнения двух величин и проверки их эквивалентности.

Пример

Название

Результат

$a==$b

Проверка равенства

Истина, если $а и $b равны

$а!= $b

Проверка неравенства

Истина, если $а и $b не равны

$а === $b

Проверка идентичности

Истина, если $а и $b равны и имеют одинаковый тип

Даже опытные программисты часто допускают одну распространенную ошибку — они пытаются проверять равенство двух величин, используя всего один знак равенства (например, $а = $b). Помните, при такой записи значение $b присваивается $а, и желаемый результат не будет достигнут.

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

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

Пример

Название

Результат

$a<$b

Меньше

Истина, если переменная $а меньше $b

$a>$b

Больше

Истина, если переменная $а больше $b

$a <= $b

Меньше или равно

Истина, если переменная $а меньше или равна $b

$a >= $b

Больше или равно

Истина, если переменная $а больше или равна $b

($a=выр1)?выр2: выр3

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

Если переменная $а равна значению выражения 1,  то возвращается значение выр2, а если не равна — возвращается значение выр3

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

4. Управляющие конструкции


if

Команда if представляет собой разновидность команды выбора, которая вычисляет значение выражения и в зависимости от того, будет ли полученный результат истинным или ложным, выполняет (или не выполняет) блок программного кода. Существует две общих формы команды i f:

if (выражение) {

блок

}

и

if (выражение) {

блок

}

else {

блок

}

Если в результате проверки условия выполняется всего одна команда, фигурные скобки не обязательны:

elseif

Команда elseif добавляет в управляющую конструкцию if дополнительный уровень проверки и увеличивает количество условий, на основании которых принимается решение:

if (выражение) {

блок

}

elseif (выражение) {

блок

}

Команда elself особенно полезна в тех случаях, когда происходит последовательное уточнение проверяемых условий. Обратите внимание: условие elself вычисляется лишь в том случае, если все предшествующие условия if и elself оказались ложными.

if ($weight < 200) {

print "Enough ";

}

elseif ($weight < 500) {

print "a lot of"; }

}

else {

print "Good";

}

В управляющих структурах используются специальные ограничители, определяющие границы блоков. Фигурные скобки ({ }) уже упоминались выше. Для удобства программистов в РНР поддерживается альтернативный формат ограничения блоков:

if (выражение) :

блок

else :

блок

endif;


while

Конструкция while предназначена для многократного (циклического) выполнения блока команд. Блок команды while выполняется до тех пор, пока условие цикла остается истинным. Общая форма цикла while выглядит так:

while (выражение) :

блок

endwhile;

Рассмотрим использование цикла while на примере вычисления факториала (n!), где n = 5:

$n = 5;

$nсору = $n;

$factorial = 1; // Установить начальное значение факториала

while ($n > 0) :

$factorial = $n * $factorial;

$n--; // Уменьшить $n на 1

endwhile;

print "The factorial of $ncopy is $factorial.";

Программа выводит следующий результат:

The factorial of 5 is 120.


do. .while

Цикл do. .while работает почти так же, как и цикл while, описанный в предыдущем разделе, однако в do. .while условие проверяется не в начале, а в конце каждой итерации. Учтите, что цикл do. .while всегда выполняется хотя бы один раз, а цикл while может вообще не выполняться, если перед входом в цикл условие окажется ложным:

do

{

блок }

while (выражение);

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


for

Цикл for обеспечивает еще одну возможность многократного выполнения блоков. Он отличается от цикла while только тем, что условие изменяется в самой

управляющей конструкции, а не где-то внутри блока команд. Как и в случае с циклом while, цикл выполняется до тех пор, пока проверяемое условие остается истинным. Общая форма конструкции for выглядит так:

for (инициализация: условие; приращение) {

блок

}

Условная часть цикла for в действительности состоит из трех компонентов. Инициализация выполняется всего один раз и определяет начальное значение управляющей переменной цикла. Условие проверяется в начале каждой итерации и определяет, должна ли выполняться текущая итерация или нет. Наконец, приращение определяет изменение управляющей переменной при каждой итерации. Возможно, термин «приращение» в данном случае неточен, поскольку переменная может как увеличиваться, так и уменьшаться в соответствии с намерениями программиста. Следующий пример демонстрирует простейший случай применения цикла for:

for ($i = 10; $i <= 100: $i +=10) : // Обратная косая черта предотвращает

print "\$i = $i <br>"; endfor; // возможную интерполяцию переменной $1

Выполнение этого фрагмента дает следующий результат:

$i = 10

$i = 20

$i = 30

$i = 40

$i - 50

$i = 60

$i = 70

$i = 80

$i = 90

$i = 100

В этом примере управляющая переменная $i инициализируется значением 10. Условие заключается в том, что цикл продолжается до тех пор, пока $i не достигнет или не превысит пороговую величину 100. Наконец, при каждой итерации значение $i увеличивается на 10. В результате команда print выполняется 10 раз, каждый раз выводя текущее значение $i. Обратите внимание: для увеличения $i на 10 используется оператор сложения с присваиванием. Для этого есть веские причины, поскольку циклы for в РНР не поддерживают более традиционной записи $i = $i + 10.

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

$х = 5:

for (: : $х +=2) :

print " $х ";

if ($x == 15) :

break; // Выйти из цикла for

endif;

endfor;

Результат выглядит так:

5 7 9 11 13 15


switch

Принцип работы конструкции switch отчасти напоминает if — результат, полученный при вычислении выражения, проверяется по списку потенциальных совпадений.

Это особенно удобно при проверке нескольких значений, поскольку применение switch делает программу более наглядной и компактной. Общий формат команды switch:

switch (выражение) {

case (условие):

блок

case (условие):

блок

...

default:

блок

}

Проверяемое условие указывается в круглых скобках после ключевого слова switch. Результат его вычисления последовательно сравнивается с условиями в секциях case. При обнаружении совпадения выполняется блок соответствующей секции. Если совпадение не будет обнаружено, выполняется блок необязательной секции default.

Как будет показано в следующих главах, одной из сильнейших сторон РНР является обработка пользовательского ввода. Допустим, программа отображает раскрывающийся список с несколькими вариантами, и каждая строка списка соответствует некоторой команде, выполняемой в отдельной конструкции case. Реализацию очень удобно построить на использовании команды switch:

<?

switch($number)

{

  case 1:

  echo ("one ");

  break;

  case 2: case 3:

  echo ("free");

  break;

  case 4: case 5:

  echo ("five");

  break;

  case 6: case 7:

  echo ("seven");

  break;

  case 8: case 9:

  echo ("nine");

  break;

  default: 

  echo ("This isn't number or number is > 9 or < 1");

}

?>

Переменная, указанная в условии switch (в данном примере — $number), сравнивается с условиями всех последующих секций case. Если значение, указанное в секции case, совпадает Со значением сравниваемой переменной, выполняется блок этой секции. Команда break предотвращает проверку дальнейших секций case и завершает выполнение конструкции switch. Если ни одно из проверенных условий не выполняется, активизируется необязательная секция default. Если секция default отсутствует и ни одно из условий не выполняется, команда switch просто завершается и выполнение программы продолжается со следующей команды.

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

В PHP в качестве меток case могут использоваться не только литералы, но и сами метки могут быть переменными. В качестве меток case в PHP не могут выступать только массивы и объекты.


Остается рассмотреть еще одну управляющую конструкцию РНР — continue. При выполнении команды continue в цикле пропускаются все оставшиеся команды текущей итерации и немедленно начинается новая итерация.