Занятие 4. Конструкции языка Инструкция if-else Начнем с самой простой инструкции - условного оператора. Его формат таков: if (логическое_выражение) инструкция_1; else инструкция_2; Действие его следующее: если логическое__выражение истинно, то выполняется инструкция_1, а иначе - инструкция_2. Как и в любом другом языке, конструкция else может опускаться, в этом случае при получении должного значения просто ничего не делается. Пример: if ($a>=1&&$b<=10) echo “Все ОК”; else echo “Неверное значение в переменной”; Если инструкция_1 или инструкция_2 должны состоять из нескольких команд, то они, как всегда, заключаются в фигурные скобки. Например: if ($a>$b) { print “а больше b”; c=$b; } elseif ($a==$b) { print “а равно b”; $c=$a; } else { print "а меньше b"; $с=$а; } Оператор if может включать сколько угодно блоков elseif, но else в каждом if может быть только один. Как правило, в конструкциях if…elseif…else оператор else определяет, что нужно делать, если никакие другие условия не являются true. Трансляция полей формы в переменные На прошлом занятии мы рассматривали простой пример обработки данных формы. Вернемся к нему. Все данные из полей формы интерпретатор преобразует в глобальные одноименные переменные. В нашем случае значение поля name после начала работы программы будет храниться в переменной $name, а значение поля age - в переменной $age. То есть, не надо ничего ниоткуда "получать" - все уже установлено и распаковано из URL-кодировки. Вот наш окончательный сценарий hello.php. Как видите, он сжался до неприличных размеров: <html><body> <? echo “Привет, $name!<br> Я знаю, Вам $age лет!”?> </html></body> Давайте теперь его усовершенствуем - сделаем так, чтобы при запуске без параметров сценарий выдавал документ с формой, а при нажатии кнопки - выводил нужный текст. Самый простой способ определить, был ли сценарий запущен без параметров - проверить, существует ли переменная с именем, совпадающим с именем кнопки отправки. Если такая переменная существует, то, очевидно, что пользователь запустил программу, нажав на кнопку. Здесь мы применим инструкцию if. <html><body> <? if (!$doGo) {?> <form action=”hello.php”> Введите имя: <input type=text name="name"><br> Введите возраст: <input type=text name="age"><br> <input type=submit name="doGo" value="Нажмите кнопку!"> </form> <?} else {?> Привет, <?=$name?>!<br> Я знаю, Вам <?=$age?> лет!" <?}?> </html></body> Из этого примера мы можем почерпнуть еще один удобный прием, который нами пока не рассматривался. Это конструкция <?=выражение?>. Она является ничем иным, как просто более коротким обозначением для <?echo (выражение)?>, и предназначена для того, чтобы вставлять величины прямо в HTML-страницу. К тому же, теперь исчезла необходимость и в промежуточном файле form.html: его код встроен в сам сценарий. Трансляция списков Механизм трансляции полей формы в РНР работает приемлемо, когда среди них нет полей с одинаковыми именами. Если же таковые встречаются, то в переменную, ясное дело, записываются только данные последнего встретившегося поля. Это довольно-таки неудобно при работе, например, со списком множественного выбора <select multiple>: <select name=Sel multiple> <option>First <option>Second <option>Third </select> В таком списке вы можете выбрать (подсветить) не одну, а сразу несколько строчек, используя клавишу <Ctrl> и щелкая по ним кнопкой мыши. Пусть мы выбрали First и Third. Тогда после отправки формы сценарию придет строка параметров Sel=First&Sel=Third, и в переменной $Sel окажется, конечно, только Third. Значит ли это, что первый пункт потерялся и механизм трансляции в РНР работает некорректно? Оказывается, нет, и для решения подобных проблем в РНР предусмотрена возможность давать имена полям формы в виде имени массива с индексами: <select name="Sel[] " multiple> <option>First <option>Second <option>Third </select> Теперь сценарию придет строка Sel[]=First&Sel[]=Third, интерпретатор обнаружит, что мы хотим создать "автомассив" (то есть массив, который не содержит пропусков, и у которого индексация начинается с нуля), и, действительно, создаст переменную $Sel типа массив, содержимое которого следующее: array (0=>"First”, 1=>"Third"). Как мы видим, в результате ничего не пропало - данные только слегка видоизменились. Забегая вперед, еще несколько слов об автомассивах. Рассмотрим такой несложный пример программы: $А[]=10; $А[]=20; $А[]=30; После отработки этих строк будет создан массив $A, заполненный последовательно числами 10, 20 и 30, с индексами, отсчитываемыми с нуля. То есть, если внутри квадратных скобок при присваивании элементу массива не указано ничего, то подразумевается элемент массива, следующий за последним. В общем-то это должно быть интуитивно понятным именно на легкость в использовании и ориентировались разработчики РНР. Прием с автомассивом в поле <select multiple>, действительно, выглядит довольно элегантно. Однако не стоит думать, что он применим только к этому элементу формы: автомассивы мы можем применять и в любых других полях. Вот пример, создающий 2 переключателя (кнопки со значениями вкл/выкл), один редактор строки и одно текстовое (многострочное) поле, причем все данные после запуска сценария, обрабатывающего эту форму, будут представлены в виде одного-единственного автомассива: <input type=checkbox name=Arr[] value=ch1> <input type=checkbox name=Arr[] value=ch2> <input type=text name=Arr[] value="Some string"> <textarea name=Arr[]>Some text</textarea> То есть, мы видим, что РНР совершенно нет никакого дела до того, в каких элементах формы мы используем автомассивы - он в любом случае обрабатывает все одинаково. И это, пожалуй, правильно. Трансляция массивов В сущности, мы уже рассмотрели почти все возможности РНР по автоматической трансляции данных формы. Напоследок взглянем на еще одно полезное свойство РНР. Пусть у нас есть такая форма: Имя: <input type=text name=Data[name]><br> Адрес: <input type=text name=Data[address]><br> Город: <br> <input type=radio name=Data[city] value=Moscow>Москва<br> <input type=radio name=Data[city] value=Peter>Санкт-Петербург<br> <input type=radio name=Data[city] value=Kiev>Киев<br> Можно догадаться, что после передачи подобных данных сценарию на РНР в нем будет инициализирован ассоциативный массив $Data с ключами name, address и city. То есть, имена полям формы можно давать не только простые, но и представленные в виде одномерных ассоциативных массивов. Забегая вперед, скажу, что у сценарии к отдельным элементам формы можно будет обратиться при помощи указания ключа массива: например, $Data[‘city’] обозначает значение той радиокнопки, которая была выбрана пользователем, а $Data[“name”] - ее имя. Заметьте, что в сценарии мы обязательно должны заключать ключи в кавычки или апострофы - в противном случае интерпретатором будет выведено предупреждение. В то же время, в параметрах name полей формы мы, наоборот, должны их избегать - уж так устроен РНР.