Переменные и основные типы данных



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

Переменные в РНР обладают следующими свойствами:

· все имена переменных должны начинаться со знака доллара ($), и по такому знаку интерпретатор определяет, что это переменная;

· значение переменной — это значение, которое было записано в нее последним;

· если вы работали с такими языками программирования, как C++ или Delphi, то знаете, что переменные должны быть сначала объявлены, а потом уже могут использоваться. В РНР объявления не являются обязательными. Переменная начинает существовать с момента присвоения ей значения или с момента первого использования. Если использование начинается раньше присвоения, то переменная будет содержать значение по умолчанию;

· переменной не назначается определенный тип. Тип определяется хранящимся значением и текущей операцией.

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

Если все Переменные называть как $paraml, $param2, $param3 И Т. Д, ТО ПО

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

При именовании переменной обязательно использовать смысловую нагрузку.

Например, если нужно сохранить где-то сумму каких-либо чисел, то заведите для этого переменную $sum. Если нужен счетчик, то хорошим вариантом является имя переменной $i. Это общепринятое правило при работе со счетчиками.

Для записи значения в переменную используется знак равенства. Слева указывается имя переменной, а справа значение, которое необходимо в нее записать: $Имя переменной = значение.

В РНР есть три основных типа переменных:

· числовой;

· строковый;

· логический.

 С первыми двумя все понятно. Если это число, то переменная содержит числовое значение. При объявлении строк значение заключается в двойные или одинарные кавычки:

$str = 'Это строка';

$str = "Это строка";

В чем разница между этими двумя строками? Допустим, что нужно вывести на печать значение переменной $index. Это можно сделать, если переменную вставить прямо в текст строки:

$index = 10;

$str = 'Index = $index';

$str = "Index = $ index ",

Если вывести на экран значение переменной $str, то в первом случае на экране мы увидим текст index=$index, а во втором index = 10. Если вы используете двойные кавычки, то все переменные внутри строки будут интерпретироваться по значению, т. е. переменная будет заменяться ее значением. Если используются одинарные кавычки, то текст выводится полностью, без проверки и изменения, что будет немного быстрее. Поэтому если в строке нет переменных, значение которых нужно вывести, то используются одинарные кавычки, чтобы интерпретатор не сканировал лишний раз строку. Это может повысить производительность. Не стоит везде использовать двойные кавычки только из-за того, что они универсальны.

Строковые переменные можно разбивать на несколько строк. Это делается

следующим образом:

$str = "This is a string.

PHP is a next generation of WEB programming.

You will like this";

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

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

А что такое логический тип? Такая переменная может содержать значение true, т. е. истина (любое значение, большее 1), или false, т. е. ложь (значение, равное нулю). В явном виде такие переменные не используются, но этот тип необходим для понимания логических операций. Например, мы уже рассматривали операцию if. .else, которая проверяет какое-либо условие. Эта проверка как раз и возвращает логическое значение true или false. Если утверждение верно, то результатом будет истина, иначе ложь.

Если какая-то переменная используется раньше, чем ей присвоено значение, то будет присвоено значение по умолчанию. Как же определить значение по умолчанию, если неизвестен тип? Тип можно определить и по контексту кода. Например, если над переменной выполняется математическая операция, которая подразумевает использование числа, то в переменную будет записано значение 0. Если это строковая операция, то результатом будет пустая строка.

Как узнать, присвоено ли значение переменной? Для этого есть функция

isSet(MMH переменной). Этой функции нужно передать в качестве параметра в скобках имя переменной, и если она содержит значение, то результатом будет true, иначе false.

Пример определения содержимого переменной

<?php

if (IsSet($index))

print('Переменная установлена'); // Переменная установлена

else

print('Переменная не установлена'); // Переменная не установлена

$index = 1;

if (IsSet($index))

print('Переменная установлена'); // Переменная установлена

else

print('Переменная не установлена'); // Переменная не установлена

После первой проверки мы увидим, что переменная $ index не установлена. Затем в переменную записывается значение. Вторая проверка покажет, что переменная уже установлена.

Так как у переменных нет определенного типа, мы можем присваивать им

что угодно, а система уже сама разберется, что записывать:

$index = 1 ; // Число

$fl = 3.14; // Дробное число

$str = 'Это строка'; // Строка

Тип переменной определяется по контексту, в котором она находится. На-

пример:

$Str = '10';

$index = 2 * $str;

На первый взгляд, данная операция невозможна. В первой строке у нас создается переменная $str, которая будет хранить строку чо1 . Во второй строке число 2 умножается на строку из переменной $str. На первый взгляд, нельзя умножать число на строку, и это верно для большинства языков программирования. Интерпретатор РНР увидит, что в переменной $str аходится строка, которую легко преобразовать в число, и выполнит преобразование. В результате в переменной $ index будет содержаться значение 20.

$str = ЧО1 ;

$index = 2 * $str;

print("Результат = $index");

В данном случае в последней строчке кода мы печатаем строку. В ней есть ссылка на переменную, содержащую число, но в результате мы получим на экране текст: "Результат = 20". Число автоматически преобразовывается в строку и корректно выводится на экран. Тип не зависит от того, что мы записали в переменную, и определяется по контексту. Если в данном контексте содержимое переменной не может быть прочитано, то будет использоваться нулевое значение. Например:

$str = 'rlO';

$index = 2 * $str;

print("Result is $index");

В данном случае в переменной $str находится строка, которая не может быть переведена в число, т. к. мешает буква г. При умножении числа 2 на эту переменную преобразование будет невозможно, и число 2 будет умножено на 0.

В результате получим нулевое значение.

А что если написать следующий код:

print(3*"hello"+2+TRUE);

Сначала выполняется умножение числа 3 на строку. Если строку нельзя преобразовать в число, то вместо строки будет использоваться 0. Число 3, умноженное на 0, дает в результате 0. Затем к нулю прибавляется 2. Результат будет равен 2. А теперь к 2 нужно прибавить истину (булево значение true). Что такое истина и ложь? Ложь — это ноль, а истина — это единица или любое большее число. Интерпретатор РНР воспримет true как единицу и прибавит к числу 2 (которое мы получили ранее) число 1. Общий результат 3.

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

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

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

· + (сложение)

· - (вычитание)

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

· / (деление)

Как и принято в математике, есть определенные правила последовательности выполнения операций (приоритет). Сначала выполняются умножение и деление, а потом уже сложение и вычитание.

Рассмотрим классический пример:

$index = 2 + 2 * 2 ;

Это классический пример, который часто задают школьникам. Не задумываясь, все ответят: 8. Если выполнять этот код слева направо, то результатом, действительно, будет 8. Но это только в головах школьников 3-го класса, которые раньше говорят, чем думают. Если считать по правилам математики и РНР, то результат будет 6, потому что сначала нужно перемножить двойки (результат 4), а потом прибавить 2 (общий результат = 6).

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

$index = ( 2 + 2 ) * 2 ;

Вот в этом случае результат будет равен 8.

В скобках действуют те же правила, что и вне скобок. Рассмотрим пример:

$index = ( 2 + 2 * 2 ) * 3 ;

Сначала интерпретатор РНР рассчитает значение в скобках, и результатом

будет 6, потому что даже здесь сначала выполняется умножение. После этого число 6 будет умножено на 3. В языке РНР есть еще сокращенные варианты увеличения или уменьшения значения переменной на 1, которые могут сильно упростить код и сделать его более элегантным. Для прибавления единицы нужно написать: $имя++,

а для вычитания $имя--.

Например:

$index = 2;

$sum = $index++;

В переменной $sum окажется число 3 (число 2 из переменной $index, уве-

личенное на 1).

Чаще всего подобные операции встречаются в циклах.

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

$strl = "Это тестовая ";

$str2 = "строка";

$str3 = $strl.str2;

Здесь создаются две переменные $stri и $str2, а в переменную $str3 записывается результат их объединения: "Это тестовая строка".

Управляющие операторы

Условные операторы

Код программы не может быть прямолинейным, потому что всегда есть какие-то условия, от которых может зависеть выполнение программы. Очень часто надо проверять такие условия и реагировать соответствующим образом. Допустим, при написания сценария главной страницы сайта. Когда пользователь заходит на сайт первый раз, можно показать ему дополнительную информацию или красивую презентацию, чтобы заинтересовать его. При последующем входе эту презентацию можно отключить. Но как это будет выглядеть в коде сценария?

Логика будет примерно следующей:

· если пользователь вошел в первый раз, то показать презентацию;

· иначе сразу показать главную страницу.

Для того чтобы сценарий был надежным и безопасным, необходимо выполнить множество проверок. Если сценарий должен отправлять почтовое сообщение, то неплохо было бы перед отправкой проверять правильность заполнения адреса e-mail.

Логика проверки будет следующей:

· если адрес e-mail верный, то отправить письмо;

· иначе выдать сообщение об ошибке.

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

Синтаксис:

if (условие) Действие 1; else Действие 2;

Если условие, указанное в скобках, верно, то выполнится действие 1, иначе будет выполнено действие 2, например:

$index = 0;

if ($index > 0)

print("Index > 0") ;

else

print("Index = 0") ;

В данном случае происходит такая проверка: если переменная $index больше нуля, то выводится первое сообщение, иначе выводится второе сообщение, которое стоит после ключевого слова else. Будет выполняться только одно действие. Если нужно выполнить два действия, то их нужно объединить в блок. Это делается с помощью фигурных скобок {}. Например, следующий код будет неверен:

$index = 0;

if ($index > 0)

print("Index > 0");

$index = 0;

else

print("Index = 0") ;

Если переменная $index больше нуля, мы пытаемся вывести сообщение

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

$index = 0;

if ($index > 0)

{

print("Index > 0");

$index = 0;

}

else

print("Index = 0");

После ключевого слова else также выполняется только один оператор. Чтобы выполнить два действия, их нужно объединить в блок с помощью фигурных скобок:

$index = 0;

if ($index > 0)

{

print("Index > 0") ,-

$index = 0;

}

else

{

print("Index = 0") ;

$index = 1;

}

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

Например:

$index = 0;

if ($index > 0)

print("Index > 0");

В данном случае на экран будет выведено сообщение, только если переменная $index больше нуля.

В языке РНР есть множество операций сравнения они представлены в таблице

Таблица Операции сравнения

№ п/п Логическая операция Результат  
1. Параметр 1 > Параметр 2 Возвращает истину (выполнится первое действие), если первый параметр больше второго
2. Параметр 1 >= Параметр 2 Возвращает истину (выполнится первое действие), если первый параметр больше или равен второму  
3. Параметр 1 < Параметр 2 Возвращает истину (выполнится первое действие), если первый параметр меньше второго
4. Параметр 1 <= Параметр 2 Возвращает истину (выполнится первое действие), если первый параметр меньше или равен второму
5. Параметр 1 == Параметр 2 Возвращает истину (выполнится первое действие), если первый параметр равен второму
6. Параметр 1 === Параметр 2 Возвращает истину (выполнится первое действие), если первый параметр равен второму и при этом оба имеют одинаковый тип данных  
7. Параметр 1 != Параметр 2 Возвращает истину (выполнится первое действие), если первый параметр не равен второму

 

А если нужно проверить два условия одновременно? В этом случае условия можно объединять с помощью логических операторов.

Таблица Операторы объединения

№ п/п Логическая операция Результат  
1. Условие 1 and Условие 2 (Условие 1 && Условие 2) Возвращает истину, если оба условия вернут истину
2. Условие 1 or Условие 2 (Условие 1 || Условие 2 ) Возвращает истину, если хотя бы одно условие вернет истину
3. Условие 1 хог Условие 2 Возвращает истину, если только одно условие вернет истину
4. !Условие Изменяет результат проверки условия на противо- положный, т. е. если результат проверки дал истину, то символ "!" изменяет его на ложь и наоборот

 

Рассмотрим пример использования двойного сравнения:

$indexl = 0;

$index2 = 1; .

if ($indexl > index2 and $index2 ==1)

print("Indexl больше Index2 и Index2 равен 1");

else

print("Indexl равен или меньше Index2 или Index2 не равен 1");

Или, например, проверка переменной на вхождение ее значения в диапазон

от 1 до 10:

$index = 0;

if ($index >= 1 and $index <= 10)

print("Index больше 1 и меньше 10");

Можно сравнивать строки или дробные числа.

Есть еще один интересный способ проверки условия. Допустим, что надо

сравнить две переменные и в результат записать наибольшую. В этом случае

код будет выглядеть следующим образом:

$result = $indexl > $index2 ? indexl : index2;

Как работает эта запись? Посмотрим на ее общий вид:

Условие ? действие1 : действие2;

Если условие верно, то выполнится действие 1, иначе выполнится действие 2. Получается, что если в нашем примере переменная $indexi больше, то результатом будет эта переменная, иначе $index2. Это достаточно хороший и удобный вариант, но большинство начинающих программистов плохо читают такой код.

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

Определение названия дня недели по числовому значению

$day = 2,-

if ($day == 1)

print("Понедельник");

else

if ($day == 2)

print("Вторник");

else

if ($day == 3)

print("Среда");

else

if ($day == 4)

print("Четверг") ;

else

if ($day == 5)

print("Пятница") ;

else

if ($day == 6)

print("Суббота");

else

if ($day == 7)

print ("Воскресенье") ;

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

будет выглядеть

$day = 2;

if ($day == 1)

print("Понедельник");

elseif ($day == 2)

print("Вторник");

elseif ($day == 3)

print("Среда");

elseif ($day == 4)

print("Четверг");

elseif ($day == 5)

print("Пятница");

elseif ($day == 6)

print("Суббота");

elseif ($day == 7)

print("Воскресенье");

Синтаксис

if (Условие1)Действие!; elseif (Условие2) print(Действие2) ;

Если первое условие верно, то выполнится первое действие и проверка закончится, иначе произойдет проверка второго условия. Если второе условие верно, то будет выполнено второе действие.

Есть еще один вариант записи оператора if:

if (условие)

Оператор 1;

Оператор 2;

endif

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

В языке РНР есть еще один вариант проверки одной переменной на соответствие одному из нескольких значений — оператор switch.

Синтаксис

switch (Переменная)

{

case Значение 1:

Операторы 1;

break,

case Значение 2:

Операторы 2;

break;

[default: Оператор]

}

В данном случае переменная сравнивается со значениями, которые указаны после ключевого слова case. Если значение переменной равно 1, то будут выполнены все операторы этого блока до ключевого слова break. Это важное отличие, которое вы должны запомнить. Если после сравнения if выполняется только один оператор (для выполнения нескольких операторов их надо объединить фигурными скобками), то в данном случае может выполняться любое количество операторов.

Если во время выполнения проверок ни одно значение не подошло, то будет выполнен оператор, который стоит после ключевого слова default. Это слово является необязательным, но может присутствовать для выполнения каких-либо действий. Например, если значение переменной не подошло ни под одну из проверок, то можно вывести сообщения об ошибке.

Давайте рассмотрим, как можно решить задачу с днями недели, которую мы рассматривали ранее, с помощью оператора switch

Использование оператора switch

$day = 4;

switch ($day)

{

case 1:

print("Понедельник");

print("Пора работать");

break;

case 2:

print("Вторник");

break;

case 3:

print("Среда");

break;

case 4:

print("Четверг");

break;

case 5:

print("Пятница");

print("Конец недели");

break;

case 6:

print("Суббота");

print("Выходной");

break;

case 7:

print("Воскресенье");

print("Выходной");

break;

Короткий вариант использования оператора switch

$day = 4;

switch ($day) {

case 1: print("Понедельник"); break;

case 2: print("Вторник"); break;

case 3: print("Среда"); break;

case 4: print("Четверг"); break;

case 5: print("Пятница"); break;

case 6: print("Суббота"); break;

case 7: print("Воскресенье"); break;

default: print("Ошибка");

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

Ключевое слово break является обязательным. Если его не поставить, то выполнится весь последующий код, что приведет к нежелательному результату. Но этот результат может оказаться и выгодным. Например, вам надо написать универсальный код, который будет получать степень любого числа от 1 до 5. Это может быть реализовано следующим образом:

$sum = 1;

Si = 3

switch

case

case

case

case

case

;

(

5:

4:

3:

2:

1:

default

Si) {

$sum =

$sum =

$sum =

$sum =

$sum =

$sum *

$sum *

$sum *

$sum *

$sum *

: print($sum);

Si;

В качестве начального значения я задал переменной $i значение 3. Код

должен будет рассчитать степень тройки. Операторы case для 5 и для 4 не сработают, а сработает вариант 3, потому что этому числу равна наша переменная. Здесь число 3 будет умножено на значение переменной $sum, которое равно 1, и результат попадет в переменную $sum. Так как нет оператора break, следующий код для case, равного 2, тоже будет выполнен. Здесь значение $sum (равное 3) будет умножено на 3, и результат 9 попадет в переменную $sum. Опять нет break, поэтому выполнится case для единицы, и значение $sum (уже равное 9) будет умножено на 3. Получится результат 27, и он будет выведен на экран, потому что снова нет break, а значит, выполнится код, который стоит после default.

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

Операторы циклов

Не менее часто в программировании используются циклы. Например, та же задача с возведением в степень, которую мы обсуждали при рассмотрении оператора switch, решается намного проще и лучше при помощи цикла. Для возведения в степень нужно выполнить операцию умножения определенное количество раз. Если нужно возвести в 3-ю степень число 2, то можно написать: 2*2*2. А если нужно возвести число 2 в сотую степень. Это уже сложнее. Можно рассчитать число заранее, но как поступить, если неизвестно, в какую степень нужно возводить число? Вот это уже самые настоящие проблемы, и здесь не обойтись без циклов.

Виды циклов:

1. Цикл for. Самым часто используемым является цикл for. Он наиболее прост в понимании.

Синтаксис

for (начальное значение; конечное значение; изменение счетчика)

Оператор

Посмотрим, как можно возвести число в степень с помощью цикла:

$sum = 1;

for ($i=l; $i<=3; $i=$i+l)

$sum = $sum * 3;

print ( $i ) ;

В этом примере запускается цикл с начальным значением переменной $i, равным 1. Цикл будет выполняться, пока значение переменной меньше или равно 3. Как только значение переменной превысит это число, цикл прервется, и результат будет выведен на экран с помощью функции print (), которая идет после цикла. На каждом шаге цикла значение переменной $i увеличивается на единицу ($i=$i+i).

На каждом шаге цикла выполняется строчка кода: $sum = $sum * з. Так как наш цикл выполняется от 1 до 3, то строчка будет выполнена три раза. После оператора for выполняется только одна строчка кода. Если необходимо выполнить два и более оператора, нужно заключить их в фигурные скобки. Например:

$sum = 1;

for ($i=l; $i<=3; $i=$i+l)

{

$sum = $sum * 3;

print("Сумма = $sum, Счетчик = $i <BR>");

}

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

Сумма = 3, Счетчик = 1

Сумма = 9, Счетчик = 2

Сумма = 27, Счетчик = 3

Таким образом мы возвели число 3 в третью степень. В качестве начальных значений могут выступать несколько переменных. Например, здесь мы беспрепятственно можем перенести объявление переменной $sum в скобки оператора for следующим образом:

for ($sum=l, $1=1; $i<=3; $i=$i+l)

{

$sum = $sum * 3;

print("Сумма = $sum, Счетчик = $i <BR>");

}

Все начальные значения перечисляются через запятую. Таким же образом может быть организовано любое количество проверок. Например, нам надо выполнять цикл, пока значение переменной $i не станет больше 3, или сумма не превысит 100. Для этого можно написать цикл следующим образом:

for ($sum=l, $i=l; $i<=3, $sum<100; $i=$i+l)

{

$sum = $sum * 3;

print("Сумма = $sum, Счетчик = $i <BR>");

}

В ограничении цикла через запятую проверяются два условия:

$i<=3 и $sum<ioo. Запятая равносильна сравнению "или" (or) и соответствует записи:

for ($sum=l, $i=l; $i<=3 or $sum<100; $i=$i+l)

Если нужно выполнять цикл, пока одно из условий не станет истинным, то можно написать так:

for ($sum=l, $i=l; $i<=3 and $sum<100; $i=$i+l)

Но в этом случае имеется один недостаток. Если вы выполните сейчас этот код, то увидите, что сумма превышает 100. Почему? Проверка происходит раньше, чем производится очередное возведение в степень. Число 3 в 4-й степени равно 81. Это меньше 100, поэтому выполняется очередной шаг цикла (еще одно возведение в степень), и результат становится 243, что и выводится на экран. Только следующая проверка увидит, что число превысило допустимое значение. Чтобы избавиться от этого эффекта, возведение в степень нужно перенести в область увеличения счетчика, т. е. так:

for ($sum=l, $i=l; $i<=3, $sum<100; $i=$i+l, $sum = $sum * 3)

print("Сумма - $sum, Счетчик = $i <BR>");

Теперь на каждом шаге цикла увеличивается не только $i, но и $sum. Результат возведения в степень будет выведен на экран только в том случае, если он соответствует обоим условиям, и сумма никогда не превысит 100.

2. Цикл while. Цикл while можно воспринимать как "выполнять действия, пока верно условие".

Синтаксис

while (условие) действие;

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

$i = 1;

$sum = is

while ($i<=3)

{

$sum = $sum * 3;

$i = $i + 1;

}

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

do действие

while (условие);

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

$1 = 1;

$sum = 1;

do

{

$sum = $sum * 3;

$i = $i + 1;

}

while ($i<=3)

Есть еще один вариант записи оператора while:

while (условие)

Оператор 1;

Оператор 2;

endwhile

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

3. Бесконечные циклы.Бывают ситуации, когда нужно сделать цикл бесконечным. В этом случае можно использовать в качестве условия для цикла while заведомо истинное значение:

while (TRUE)

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

Цикл for тоже можно сделать бесконечным. Это делается следующим образом:

for (;;)

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

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

Прервать выполнение цикла можно с помощью оператора break. Например:

$index=l;

while ($index<10)

{

print("$index <BR>");

$index++;

if ($index==5)

break;

}

Данный цикл должен выполняться, пока знамение переменной $ index не станет равным или больше 10. В теле цикла есть проверка: если значение переменной равно 5, то цикл прерывается с помощью оператора break. Таким образом, цикл будет выполнен только до 5. А если нужно пропустить какое-то значение и не выполнять цикл или какую-то его часть? Для этого есть оператор continue.

Рассмотрим пример его использования:

$index=0;

while ($index<10)

{

$index++;

if ($index==5)

continue;

print("$ index <BR>");

}

В данном случае в цикле выполняется печать чисел от 1 до 9, и мы должныпропустить число 5. Для этого переменной $ index присваивается значение 0. Почему 0, если нужно печатать с 1? Просто в теле цикла мы сначала увеличиваем значение переменной на 1, а потом уже печатаем, т. е. на первом же шаге еще до печати 0 будет увеличен на 1, и распечатается единица. Если переменная $ index равна 5, то печати не будет, потому что выполнится оператор continue, и выполнение перейдет в начало. Будьте внимательны при использовании оператора continue.

Посмотрите следующий код и найдите ошибку:

$index=l;

while ($index<10)

{

if ($index==5)

continue;

print("$ index <BR>");

$index++;

}

Синтаксической ошибки здесь нет, и, на первый взгляд, код должен выполнять те же действия, что и предыдущий. В переменную $index занесли начальное значение 1, потому что теперь увеличение счетчика идет после печати и вроде бы все правильно. Если цикл дойдет до 5, то печати не будет и произойдет переход на начало цикла. В этом и заключается ошибка.

После перехода счетчик не изменился (значение переменной $ index не увеличено и равно 5), и снова проверка с числом 5 даст истину. Таким образом, цикл "заклинит", и он постоянно будет переходить с пятой строки на вторую. Этой проблемы нет при использовании цикла for, потому что увеличение при переходе на новый шаг происходит сразу же по формуле, указанной в качестве последнего параметра в скобках:

for ($index=l; $index<10; $index++)

{

if ($index==5)

continue;

3 Зак. 1315

58 Глава 2

print("$index <BR>");

}

    В случае с циклом for можно поступить немного другим способом — самостоятельно увеличить значение переменной $ index в теле цикла:

for ($index=l; $index<10; $index++)

{

if ($index==5)

$index++;

print("$index <BR>");

}

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

Массивы

Массив представляет собой индексированную совокупность переменных одного типа. Каждая переменная или элемент массива имеет свой индекс,т. е. все элементы массива последовательно пронумерованы от 0 до N, где ./V—размер массива.

 - Одномерные массивы

Существует два метода создания одномерных массивов:

• простое присвоение значений элементам массива;

Значение присваивается массиву без указания индекса, что приводит к добавлению элемента в конец массива.

<?php

$number[] = " 1";

$number[] - "2";

$number[] = " 3 " ;

echo($number[0]);

В результате выполнения этого скрипта будет выведена цифра 1.

• использование конструкции array ().

<?php

$number = array("1", "2", "3") ;

echo($number[1]); // выводит число 2

 

- многомерные массивы

<?рпр

$ship = array(

"Пассажирские корабли" => array("Лайнер","Яхта","Паром"),

"Военные корабли" => array("Авианосец","Линкор","Эсминец"),

"Грузовые корабли" => array("Сормовский","Волго-Дон","Окский")

);

print_r($ship);

В результате такой инициализации будет создан массив следующей структуры:

Array

(

[Пассажирские корабли] => Array

[0] => Лайнер

[1] => Яхта

[2] => Паром

)

[Военные корабли] => Array

(

[0] => Авианосец

[1] => Линкор

[2] => Эсминец

)

[Грузовые корабли] => Array

(

[0] => Сормовский

[1] => Волго-Дон

[2] => Окский

В этом примере создан двумерный массив с количеством элементов 3 х З, т. е. получилось три массива, каждый из которых содержит в себе по три элемента. Полученный массив является смешанным, т. е. в нем присутствуют как индексы, так и ключи ассоциативного массива— обращение к элементу $ship ['Пассажирские корабли'] [0] возвратит значение "Лайнер".

Существует три способа обхода массива в цикле:

· с помощью цикла foreach - при проходе каждого элемента массива в переменную $кеупомещается ключ этого элемента, а в переменную $value— его значение, цикл foreach специально создан для ассоциативных массивов и имеет следующий синтаксис:

foreach (array as [$key ->] $value)

{ операторы;}

Пример:

<?php

$nuraber = arrayC'first" => "1", "second" => "2", "third" => "3");

foreach($number as $index => $val) echo "$index = $val <br>";

Результат:

first - 1

second = 2

third = 3

 

 

· с помощью цикла for;

<?php

Snumber = array("1", "2", "3");

for($i=0; $i < count($number); $i++)

{

echo $number[$i];

Результат: 123.

Функция count о, используемая в этом примере, предназначена для вывода количества элементов массива.

· с помощью цикла while, используя конструкцию each-list.

С помощью комбинации функций list—each, используя цикл while, также можно организовать перебор элементов массива.

list() - предназначена для помещения элементов массива в отдельные переменные.

each() - возвращает пару "индекс— значение" текущего элемента массива и сдвигает курсор (указатель) массива на следующий элемент.

reset() - предназначена для установки указателя массива на первый элемент и возвращает значение первого элемента массива

Пример:

<?php

$number = array("1", "2", " 3 й ) ;

reset($number); // Устанавливаем указатель массива на первый элемент

while(list($key, $val) = each($number))

{

echo ($val)

}

Результат 123.

Суперглобальные массивы

В РНР, для того чтобы передать данные из формы в скрипт-обработчик, можно просто написать в коде формы, к примеру, <input type=text name=name_box value '<? echo $name?> '> В обработчике значение из формы будет помещено в переменную $ name box. Это связано с определенным риском, т. к. злоумышленник может передать методом GET или POST параметры, имена которых совпадут с переменными, используемыми в скрипте, и если последние не инициализируются должным образом, это может повлиять на ход выполнения скрипта.

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

Для получения доступа к данным, переданным методами GET и POST, следует обращаться к суперглобальным массивам $_GET И $_POST.

Пример:

<?php

$name - $_GET['name'];

$test = $_POST[•test'];


Дата добавления: 2018-04-05; просмотров: 196; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!