ПОЗНАВАТЕЛЬНОЕ Сила воли ведет к действию, а позитивные действия формируют позитивное отношение Как определить диапазон голоса - ваш вокал
Игровые автоматы с быстрым выводом Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими Целительная привычка Как самому избавиться от обидчивости Противоречивые взгляды на качества, присущие мужчинам Тренинг уверенности в себе Вкуснейший "Салат из свеклы с чесноком" Натюрморт и его изобразительные возможности Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д. Как научиться брать на себя ответственность Зачем нужны границы в отношениях с детьми? Световозвращающие элементы на детской одежде Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия Как слышать голос Бога Классификация ожирения по ИМТ (ВОЗ) Глава 3. Завет мужчины с женщиной 
Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д. Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу. Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар. | Общий интерфейс шлюзов CGI Серверы Web обеспечивают просмотр пользователем документов и переход с одного документа на другой. Часто такого взаимодействия пользователя с сервером Web бывает недостаточно. Во многих случаях пользователь должен получать для просмотра не статические документы, хранящиеся на сервере Web, а динамические, содержимое которых изменяется в соответствии с работающей на сервере Web программой. Для реализации подобной возможности необходимо выполнение, по крайней мере, двух условий. Во-первых, сервер Web должен уметь инициировать запуск на выполнение программ в соответствии с запросом пользователя. Во-вторых, необходима возможность передачи данных от пользователя удаленной программе, а также результатов работы программы – пользовательскому агенту. Для выполнения этих условий необходим программный интерфейс между сервером Web и запускаемым приложением. При создании Web был разработан такой интерфейс, получивший название общего интерфейса шлюзов (Common Gateway Interface, CGI). Технология CGI относится к технологиям стороны сервера. Это означает, что программа CGI запускается на сервере Web и работает в его локальной операционной системе. Взаимодействие пользовательского агента с удаленной программой осуществляется по следующей общей схеме (рис. 2): 1. Пользовательский агент соединяется с сервером Web, на котором расположена программа, и передает ему запрос, содержащий идентификатор программы и данные для обработки. Идентификатор передается в стартовой строке запроса. Место расположения данных для обработки в запросе зависит от метода, применяемого к запрашиваемой программе. 2. Сервер Web получает запрос пользователя, запускает программу, идентификатор которой содержится в стартовой строке полученного запроса, передает ей по интерфейсу CGI данные для обработки и обеспечивает возможность получения результатов работы программы CGI. 3. Программа обрабатывает полученные от сервера Web данные, формирует документ, содержимое которого является результатом обработки полученных данных, и отправляет сформированный документ серверу Web. 4. Сервер Web формирует сообщение ответа HTTP с результатом работы программы в качестве объекта, и передает его пользовательскому агенту. Данные для обработки могут быть содержимым формы, заполненной пользователем. Форма – это часть документа HTML, содержащая органы управления, информация о состоянии которых может быть передана пользователем серверу Web. Для размещения формы внутри документа HTML используется элемент FORM: <FORM action=uri method=m enctype=mime>...</FORM> Обязательны как начальный, так и конечный тэги. Атрибут action задает идентификатор программы, которой будут отправлены данные формы для обработки. Чаще всего это программа CGI, однако, можно указать идентификатор обычного пассивного документа. В последнем случае обработки формы не произойдет, но будет осуществлен переход к новому документу. Атрибут method задает метод, применяемый к ресурсу. Может принимать значения GET и POST. Атрибут enctype задает способ кодирования содержимого формы (значений в строках ввода, состояний переключателей). Если данные из формы будут переданы серверу Web в теле сообщения запроса, то способ кодирования означает тип содержимого и передается в заголовке объекта Content-Type. По умолчанию применяется единственный возможный для метода GET способ кодирования application/x-www-form-urlencoded. Для метода POST применим также способ text/plain. Внутри формы, помимо других элементов, могут находиться элементы органов управления. Элементы органов управления могут располагаться и вне элементов FORM. В этом случае данные из органов управления для обработки передаются отображаемому в настоящий момент документу. Отправка формы может осуществляться при нажатии кнопки класса submit, при нажатии клавиши ENTER в строке ввода, при нажатии мышью внутри органа управления класса image. При отправке формы клиент производит следующие действия: 1. Кодирование содержимого элементов. У каждого органа управления (элемента) формы имеются атрибуты name и value, обозначающие соответственно имя элемента и значение. Имя задается в документе HTML. Значение зависит от типа элемента. Например, для строки ввода – это введенная строка, для включенного одиночного переключателя – on, для группы переключателей – имя включенного. Кодирование заключается в замене некоторых недопустимых символов последовательностями допустимых. Пробелы в значениях кодируются символом '+'. Символы с кодом больше или равным 127, а также некоторые символы с кодом меньше 127, например, '+', '%' и '&', кодируются тройкой символов '%hh', где hh – две шестнадцатеричные цифры кода символа. Код символа зависит от кодировки, в которой создан содержащий форму документ. Таким образом, для каждого элемента получается строка вида name=value, где name – имя элемента органа управления, value – строка с закодированным значением элемента органа управления. 2. Кодирование содержимого формы в соответствии с атрибутом enctype элемента FORM. В случае способа кодирования application/x-www-form-urlencoded полученные строки для каждого элемента соединяются друг с другом символом '&': name1=value1&name2=value2&...&nameN=valueN В случае способа кодирования text/plain строки разделяются символами перевода строки и возврата каретки: name1=value1 name2=value2 ... nameN=valueN 3. Формирование HTTP-сообщения запроса. В случае метода GET кодированное содержимое формы присоединяется к идентификатору запрашиваемого ресурса (программы CGI) в начальной строке запроса при помощи символа '?': URI?name1=value1&name2=value2&...&nameN=valueN В случае метода POST кодированное содержимое формы помещается в тело сообщения. В сообщение запроса включается заголовок Content-Type, в котором содержится способ кодирования содержимого, и заголовок Content-Length, указывающий на длину кодированного содержимого. 4. Отправка сообщения серверу. При получении сообщения запроса от клиента сервер выполняет следующие действия: 1. По идентификатору определяет, что запрашиваемый ресурс является программой. 2. Выделяет блок памяти для переменных окружения создаваемого процесса. В выделенный блок копируются переменные окружения процесса сервера Web. 3. Создает переменные окружения с информацией о протоколе HTTP, сервере Web и интерфейсе CGI и добавляет в выделенный блок переменных окружения. В табл. 9 приведены основные переменные окружения CGI. 4. Запрашиваемый метод из полученного сообщения присоединяется в виде значения к переменной окружения REQUEST_METHOD, после чего созданная переменная добавляется в выделенный блок переменных окружения. 5. Часть заголовков из полученного сообщения запроса преобразуется в соответствующие переменные окружения и добавляется в созданный блок переменных окружения. Таблица 9 | Основные переменные окружения CGI | Переменная | Значение | SERVER_SOFTWARE | Значение заголовка Server | SERVER_NAME | Имя хоста, на котором работает сервер Web | CONTENT_LENGTH | Значение заголовка Content-Length | CONTENT_TYPE | Значение заголовка Content-Type | SERVER_PROTOCOL | Версия протокола HTTP сервера | SERVER_PORT | Номер порта, на котором работает сервер | REQUEST_METHOD | Метод из стартовой строки сообщения запроса | PATH_TRANSLATED | Путь к корневому каталогу сервера Web в локальной файловой системе сервера | SCRIPT_NAME | URI программы CGI относительно сервера Web | QUERY_STRING | Кодированное содержимое формы из стартовой строки сообщения запроса | REMOTE_HOST | Имя хоста клиента | REMOTE_ADDR | Адрес хоста клиента | HTTP_ACCEPT | Значение заголовка Accept | HTTP_USER_AGENT | Значение заголовка User-Agent | 6. Если метод в стартовой строке сообщения запроса является методом GET, то от идентификатора запрашиваемого ресурса отделяется строка с кодированным содержимым формы (после символа '?'), которая рассматривается как значение переменной окружения QUERY_STRING, после чего сформированная переменная добавляется в созданный блок переменных окружения. 7. Создает дочерний процесс из загрузочного модуля программы CGI, идентификатор которой передан в стартовой строке сообщения запроса, причем блоком окружения созданного процесса становится созданный сервером блок. 8. Если метод в стартовой строке сообщения запроса является методом POST, то в стандартный поток ввода (дескриптор 0) созданного процесса передается тело сообщения запроса. 9. При помощи операции замены дескриптора дескриптор стандартного потока вывода (дескриптор 1) созданного процесса заменяется дескриптором канала (или другого коммуникационного объекта), связанного с процессом сервера Web. 10. Читает передаваемые программой CGI данные, формирует из них сообщение HTTP ответа и отправляет его пользовательскому агенту. Если какие-либо из действий выполнить не удалось, то пользовательскому агенту отправляется строка с ошибочным кодом состояния и созданный процесс уничтожается. Все современные операционные системы содержат в своем API средства для запуска дочернего процесса с данной средой окружения. В DOS – функция 4B00h прерывания 21h, в UNIX – системный вызов execve, в WIN32 – функция API CreateProcess. В любом случае, прикладная программа может получить доступ к среде окружения. Языки высокого уровня унифицируют интерфейс доступа к среде окружения для различных ОС. Например, в языках C и C++ имеются следующие переменные и функции: #include <stdlib.h> extern char **environ; #include <stdlib.h> char *getenv(char *varname); Указатель на массив строк environ может быть использован для доступа ко всей среде окружения процесса. В массиве содержатся переменные окружения в формате "name=value", где name – имя переменной окружения, value – ее значение. Последний элемент массива содержит пустую строку в качестве признака окончания среды процесса. Функция getenv позволяет получить значение переменной окружения, имя которой передано в качестве параметра varname. Если переменная с данным именем отсутствует, функция возвращает 0. Если программой CGI обрабатывается запрос, содержащий метод POST, то тело сообщения запроса, в котором находится кодированное содержимое отправленной клиентом формы, можно получить из стандартного потока ввода. С каждым процессом связан стандартный поток ввода. Чтение из этого потока стандартно означает чтение с клавиатуры. При помощи операций с дескрипторами можно поместить блок данных в стандартный поток ввода. Читать из стандартного потока ввода в языке C удобнее всего при помощи функции чтения потока: #include <stdio.h> int fread(void *buffer, size_t size, size_t count, FILE *stream); В параметре buffer передается адрес буфера, куда будут помещены прочитанные данные. В параметрах size и count указывается длина читаемого блока. Поскольку пользовательский агент передает длину тела сообщения в байтах, то в параметре size указывается 1, а в параметре count – длина тела сообщения запроса. В качестве параметра stream следует передать константу stdin для указания, что считывание производится из стандартного потока ввода. Функция fread возвращает количество фактически прочитанных символов. Чтение из стандартного потока ввода является блокирующим, поэтому следует заранее определить число читаемых символов. Клиент вместе с другими заголовками передает заголовок Content-Length, в котором сообщается длина тела сообщения. Сервер при формировании среды окружения создает переменную CONTENT_LENGTH, значение которой совпадает со значением соответствующего заголовка. Поэтому чтением данной переменной можно определить число символов в стандартном потоке ввода. Помимо стандартного потока ввода, с каждым процессом связан стандартный поток вывода. Для обычных процессов стандартный поток вывода, как правило, связан с экраном. При помощи операций замены дескриптора можно переключить стандартный поток вывода на любой открытый дескриптор. Сервер Web осуществляет переключение стандартного потока вывода на дескриптор канала или другого коммуникационного объекта. В результате такого перенаправления вся выводимая программой CGI в стандартный поток вывода информация будет передаваться серверу Web. Формат данных, передаваемых от приложения CGI серверу Web, совместим с форматом сообщений протокола HTTP. Эти данные должны содержать заголовки, пустую строку и тело сообщения. Заголовки делятся на заголовки CGI и заголовки HTTP. Существует 3 заголовка CGI: 1. Content-Type – тип содержимого передаваемого тела сообщения. Значение соответствует заголовку Content-Type протокола HTTP. 2. Location – идентификатор, в котором содержится запрашиваемый ресурс. Значение соответствует заголовку Location протокола HTTP. При получении данного заголовка сервер Web передает пользовательскому агенту ответ с кодом перенаправления. 3. Status – строка состояния. Значением данного заголовка является трехзначный код состояния и поясняющая фраза, которые сервер Web должен передать пользовательскому агенту. Все остальные заголовки считаются сервером Web заголовками HTTP и передаются пользовательскому агенту без изменения, также как и тело сообщения. Можно считать, что данные передаются от программы CGI непосредственно клиенту Web. Выводить в стандартный поток вывода можно при помощи функции printf(): #include <stdio.h> int printf(char *format, ...); При обмене двоичными данными между приложением CGI и сервером Web, например, при отправке графического изображения, сформированного приложением CGI в процессе своей работы, следует учитывать некоторые особенности. Потоки могут находиться в двух режимах: двоичном и текстовом. В двоичном режиме данные передаются в том виде, в котором они представляются при хранении этих данных в памяти. В текстовом режиме некоторые символы могут приводить к определенным эффектам. Например, при записи символа конца файла происходит закрытие текстового потока, а при записи символа перевода строки в текстовый поток записываются два символа: перевода строки и возврата каретки. Аналогично, при чтении двух символов из потока, содержащего подряд символы перевода строки и возврата каретки, будет считан только один символ перевода строки. Поскольку стандартные потоки, как правило, открываются в текстовом режиме, перед передачей двоичных данных следует перевести эти потоки в двоичный режим. Для перевода потока в двоичный режим следует сначала получить его дескриптор. Это можно сделать, вызвав функцию fileno() стандартной библиотеки: #include <stdio.h> int fileno(FILE *stream); Единственным параметром данной функции является указатель на поток. При получении дескриптора стандартного потока вывода в качестве значения параметра следует указать константу stdout, а при получении дескриптора стандартного потока ввода – stdin. Полученное значение дескриптора теперь можно использовать при вызове функции setmode() для перевода потока в двоичный режим: #include <io.h> #include <fcntl.h> int setmode(int handle, int mode); Первым параметром данной функции является дескриптор открытого потока. Вторым параметром является режим, в который будет переведен поток, задаваемый одной из констант: O_TEXT при переводе потока в текстовый режим или O_BINARY при переводе потока в двоичный режим. Функция возвращает ранее установленный режим для данного потока или –1 в случае ошибки. Для записи в поток, находящийся в двоичном режиме, удобно использовать функцию fwrite(): #include <stdio.h> int fwrite(void *buffer, size_t size, size_t count, FILE *stream); В параметре buffer передается адрес буфера, откуда будут взяты записываемые в поток данные. В параметрах size и count указывается длина читаемого блока. Поскольку приложение CGI передает длину тела сообщения в байтах, то в параметре size указывается 1, а в параметре count – длина передаваемого блока данных. В качестве параметра stream следует передать константу stdout, для указания того, что запись производится в стандартный поток вывода. Функция fwrite() возвращает количество фактически записанных символов. Функцию printf() неудобно использовать при передаче двоичных данных, поскольку в передаваемом блоке могут оказаться нули. Стандартный поток ввода практически всегда нужно переводить в двоичный режим, поскольку, если передаваемые от пользовательского агента данные являются многострочными, то есть содержат символы перевода строки и возврата каретки, то значение переменной окружения CONTENT_LENGTH не будет соответствовать фактическому числу символов, прочитанному из стандартного потока ввода в текстовом режиме. Программа CGI должна выполнить следующие действия: 1. Прочитать значение заголовка REQUEST_METHOD для определения запрашиваемого метода. 2. Если запрашиваемый метод – GET, то прочитать переменную окружения QUERY_STRING и считать полученное значение кодированным содержимым формы. Способ кодирования считать равным application/x-www-url-encoded. 3. Если запрашиваемый метод – POST, то прочитать длину тела сообщения запроса из переменной окружения CONTENT_LENGTH. Из стандартного потока ввода прочитать тело сообщения запроса и считать его кодированным содержимым формы. Способ кодирования прочитать из переменной окружения CONTENT_TYPE. 4. Разобрать кодированное содержимое формы в зависимости от способа кодирования. 5. Прочитать необходимые программе CGI переменные окружения. 6. Выполнить все необходимые в программе действия и сформировать документ с результатом работы программы. 7. Отправить в стандартный поток вывода все необходимые заголовки CGI и HTTP и пустую строку. 8. Отправить в стандартный поток вывода сформированный документ. 3. 2. Сценарии стороны сервера. Технология PHP Технология CGI позволяет создавать серверные приложения любой сложности, без ограничения возможностей программ CGI. Однако данная технология обладает рядом недостатков. 1. При получении данных от клиента приложению приходится производить сложный разбор строки параметров запроса. Задача усложняется, если в запросе присутствуют строки в национальной кодировке. 2. Содержимое документа HTML формируется приложением CGI. При изменении дизайна приходится осуществлять перекомпиляцию приложения. 3. Приложения CGI, использующие интерфейс прикладных программ (API) локальной операционной системы сервера, плохо переносимы. Одним из вариантов решения приведенных проблем является использование технологии PHP для динамического формирования документов HTML на стороне сервера. Технология PHP является технологией стороны сервера. Аббревиатура PHP раскрывается рекурсивно: "PHP: Hypertext Preprocessor". Основными сферами применения данной технологии являются создание серверных приложений и интерфейсов к базам данных. Приложения PHP встраиваются в документы HTML в качестве сценариев, подобно сценариям JavaScript, однако, в отличие от JavaScript, сценарии PHP выполняются не пользовательским агентом, а специальной программой – проигрывателем сценариев PHP, которая является приложением CGI и запускается сервером. Пользовательский агент получает результат выполнения запрошенного им сценария и не видит кода самого сценария. Документ HTML, содержащий сценарий PHP, как правило, имеет специальное расширение, например, php3 или phtml. При получении запроса такого документа сервер выполняет следующие действия: 1. Запрашивает локальную операционную систему о типе файла php3 или phtml. 2. Получив ответ, что данный файл является сценарием и путь к программе, выполняющей подобные сценарии, запускает проигрыватель сценариев, указав запрошенное пользователем имя файла в качестве параметра запуска. 3. Проигрыватель сценариев PHP анализирует содержимое документа, выполняя инструкции PHP и передавая остальное содержимое клиенту без изменений. На рис. 3 приведено взаимодействие различных компонентов при запросе клиентом сценариев PHP. Инструкции PHP внутри документа html располагаются внутри специальных скобок, состоящих из последовательностей символов "<?" и "?>" или "<?php" и "?>". Можно также для включения сценариев PHP использовать элемент SCRIPT с атрибутом language, имеющим значение "php". Текст, находящийся вне специальных скобок, и называемый статической частью документа, проигрывателем сценариев PHP не анализируется и передается клиенту без изменений. Фактически, статическая часть является шаблоном документа HTML. Синтаксис языка сценариев PHP похож на синтаксис языков программирования C, C++, Java. Сценарий PHP представляет собой оператор PHP или последовательность операторов PHP, разделенных символами ";". Основными объектами языка сценариев PHP являются переменные, выражения, операторы и функции. Переменные в PHP не имеют типа. Тип переменной определяется хранимым в данной переменной значением. Тип переменной динамически изменяется в зависимости от контекста. В PHP различаются следующие типы: целый - integer; действительный - double; строковый - string; массив - array; объект - object. Преобразование типов осуществляется неявно, например, при подстановке переменных в качестве параметров функций, или явно, при указании типа, к которому нужно преобразовать значение переменной, перед именем. Переменные различаются по именам. Имя переменной в PHP начинается с символа "$". Для определения переменной нужно присвоить ей значение при помощи операции присваивания. Способы создания нового значения переменной отличаются для различных типов. Переменной скалярного типа (integer, double, string) можно присвоить в качестве значения соответствующую константу. Массивы в PHP являются не набором переменных, а переменными некоторого определенного типа array. В языке сценариев PHP массивы ассоциативны. Это означает, что индексом массива может являться не только число, но и строка. Индекс ассоциативного массива называется ключом. Новый массив может быть создан либо при создании элемента массива, либо при помощи вызова array. Для создания нового элемента массива нужно при присваивании значения переменной после имени указать ключ в квадратных скобках. При этом имя переменной будет именем созданного массива, а значение в квадратных скобках – ключом для получения доступа к значению созданного элемента массива. В PHP массивы являются динамическими. При присваивании значения элементу массива проверяется, существует ли уже в массиве элемент с заданным ключом. Если существует, то его значение заменяется на новое. В противном случае создается новый элемент массива. Все элементы массива объединены в двусвязный список. В массиве имеется внутренний указатель текущего элемента. Имеется возможность просмотреть текущее значение указателя, а также переместить указатель на предыдущий или последующий элемент в списке, а также на начальный или конечный элементы списка. Таким образом, можно осуществить последовательный доступ к каждому элементу массива. Для элементов массива с целочисленными ключами ведется счетчик индексов. Значением счетчика является увеличенное на единицу максимальное в массиве значение целочисленного ключа (индекса). Если массив не содержит элементов с целочисленными ключами, то счетчик индексов имеет нулевое значение. Если при присваивании значения элементу массива не указывать ключа в квадратных скобках, то ключом для нового элемента будет значение счетчика индексов, который после создания нового элемента увеличится на единицу. Данная возможность позволяет добавлять в конец массива элементы с последовательными индексами. Для создания массива с несколькими начальными элементами используется ключевое слово array, после которого в круглых скобках перечисляются присваиваемые элементам массива значения. В качестве ключей элементов используется счетчик индексов. Такое назначение ключей по умолчанию можно изменить при помощи операции "=>". Данная операция применяется в следующем виде: ключ => значение Если в списке значений array встречается подобная операция, то очередному элементу массива будет присвоен указанный ключ. Данная возможность используется для создания массивов со строковыми ключами, а также для пропуска значений целочисленных ключей (индексов). Объекты в PHP служат для поддержки объектного программирования. Для создания нового объекта используется вызов new. Переменным любого типа можно присваивать в качестве значения другие переменные, а также значения, возвращаемые функциями и методами объектов. В PHP можно создавать ссылки на переменные. Ссылка – это имя переменной, отличное от заданного при определении. Для создания ссылки нужно определить переменную, значением которой будет имя ссылки. Если теперь присвоить значение переменной, в которой хранится имя ссылки, указав перед именем переменной двойной символ "$$", то будет создана ссылка, к которой можно обращаться по имени как к обычной переменной. При одновременной работе со ссылками и массивами возникает неопределенность, связанная с приоритетами символов "$" и квадратных скобок. Для разрешения данной неопределенности можно использовать фигурные скобки как символы явного определения приоритетов. При выполнении сценария PHP интерпретатор определяет ряд переменных, связанных с параметрами сервера, протокола HTTP, самого интерпретатора, а также полученным запросом. Каждый орган управления формы, содержащийся в документе HTML, имеет атрибуты name и value. При разборе полученного от клиента запроса интерпретатор PHP создает переменные, именами которых являются значения атрибутов name, а значениями – значения атрибутов value соответствующих органов управления. Это упрощает разбор форм в сценариях PHP. Важным понятием языка интерпретатора PHP является понятие выражения. Выражение – это константа, переменная или составленная из них при помощи операций конструкция. Выражение может быть составной частью более сложного выражения. Каждое выражение имеет значение, которое называется значением выражения. Значением операции является ее результат. Тип значения выражения зависит от типов входящих в выражение переменных и констант, а также от операций. Помимо типов, которые могут иметь переменные, значения выражений могут быть булевого типа. Выражения булевого типа могут принимать только значения FALSE или TRUE. Значения булевого типа не могут быть присвоены переменным, но иногда подставляются в функции и операторы. При подстановке переменных вместо булевых выражений происходит преобразование типа переменной к булевому. Для целых чисел значение FALSE имеет только 0, для строк – строки "" и "0". Операции языка интерпретатора PHP приведены в табл. 10. Таблица 10 | Операции PHP | Знак | Операция | Арифметические | + | Сложение | – | Вычитание | * | Умножение | / | Деление | % | Остаток от деления | Строковые | . | Конкатенация строк | Присваивание | = | Обычное присваивание | += | Присваивание со сложением | –= | Присваивание с вычитанием | *= | Присваивание с умножением | /= | Присваивание с делением | %= | Присваивание с получением остатка | .= | Присваивание с конкатенацией | Побитовые | & | Побитовое умножение (И) | | | Побитовое сложение (ИЛИ) | ~ | Побитовое отрицание (НЕ) | Окончание табл. 10 | Знак | Операция | Логические | and | Логическое И | or | Логическое ИЛИ | xor | Логическое исключающее ИЛИ | ! | Логическое отрицание | && | Логическое И | || | Логическое ИЛИ | Сравнение | == | Равно | != | Не равно | < | Меньше | > | Больше | <= | Меньше или равно (не больше) | >= | Больше или равно (не меньше) | Сценарий PHP состоит из операторов. Помимо оператора вычисления выражения, существует ряд операторов, характерных для структурных языков. Некоторые операторы PHP имеют два синтаксиса: синтаксис языка C и модифицированный синтаксис для вставки HTML-кода внутрь операторов. В табл. 11 приведены основные операторы PHP. Операторы записаны с использованием синтаксиса языка C. Таблица 11 | Операторы PHP | Синтаксис | Оператор | if (cond1) {...} elseif (cond2) {...} ... else {...} | Ветвление | while (cond) {...} | Цикл с предусловием (цикл ПОКА) | do {...} while (cond) | Цикл с постусловием (цикл ДО) | for (init; cond; expr) {...} | Цикл с предусловием | break | Безусловный переход на конец операторов while, do while, for и switch | continue | Безусловный переход на следующий цикл | Окончание табл. 11 | Синтаксис | Оператор | switch (var) { case val1: ... case val2: ... ... default: ... } | Выбор | function name(parameters) {...} | Определение функции | return val | Возврат значения | Синтаксис определения функции в интерпретаторе PHP отличается от синтаксиса языка C. Функция – это набор операторов или часть кода, выполняемая при разборе специальной операции, называемой вызовом функции. Для вызова функции указывается ее имя, за которым в круглых скобках следует набор параметров, передаваемых функции. Пользовательские функции определяются при помощи оператора function. При определении функции указывается ее имя и список параметров. Параметры перечисляются через запятую. Каждый параметр считается локальной переменной функции. Внутри блока операторов функции могут определяться новые переменные. Каждая переменная, определенная на внутреннем уровне является локальной. Все обычные локальные переменные создаются в стеке при каждом вызове функции и уничтожаются после завершения. Функции не имеют доступа к глобальным переменным. Для получения доступа к глобальным переменным последняя должна быть локально переобъявлена. Локальное переобъявление выполняется указанием ключевого слова global перед именем глобальной переменной, к которой необходимо получить доступ. Помимо обычных (автоматических) локальных переменных, в функции можно определить статические переменные, которые создаются при определении функции и существуют все время пока выполняется программа. Для определения статической переменной перед ее именем нужно указать ключевое слово static. Статические переменные сохраняют свое значение после выхода из функции. Функции могут возвращать значения. Для этого используется оператор return. Тип возвращаемого значения зависит от типа параметра оператора return. Стандартно параметры передаются в функцию по значению. Это означает, что при вызове функции для каждого параметра создается локальная переменная, куда копируется значение передаваемого параметра. В PHP имеется возможность организовать передачу параметров функции по ссылке. Для этого в списке параметров при определении функции перед именем параметра необходимо указать символ "&". При передаче по ссылке при вызове функции для передаваемого параметра создается еще одно имя, которое является именем параметра или, что то же самое, именем локальной переменной функции. При передаче по ссылке у функции имеется возможность изменять значение передаваемой переменной. Если необходимо при некоторых вызовах одной и той же функции передавать параметр по значению, а при других по ссылке, то функция должна быть определена обычным образом. При этом при вызове функции с передачей параметра по ссылке следует в списке параметров перед соответствующим параметром указать символ "&". Параметры функции могут иметь значение по умолчанию. Для указания значения параметра по умолчанию в списке параметров после имени параметра ставится символ "=", за которым следует необходимое значение. Если какой-либо параметр имеет значение по умолчанию, то все последующие параметры в списке также должны иметь значения по умолчанию. При вызове функций со значениями параметров по умолчанию соответствующие параметры вызова можно опустить. В интерпретаторе PHP имеются встроенные функции. Встроенные функции определены в самом интерпретаторе или в загружаемых модулях. В табл. 12 приведены основные встроенные функции PHP. Таблица 12 | Встроенные функции PHP | Функция | Описание | Математические функции | mixed abs(mixed x) | Абсолютное значение аргумента x | int ceil(double x) | Наименьшее целое, большее x | int floor(double number) | Наибольшее целое, меньшее x | Продолжение табл. 12 | Функция | Описание | double round(double x) | Округление | string decbin(int dec) | Преобразование десятичного числа в двоичное | string dechex(int dec) | Преобразование десятичного числа в шестнадцатеричное | string decoct(int dec) | Преобразование десятичного числа в восьмеричное | int bindec(string bin) | Преобразование двоичного числа в десятичное | int hexdec(string hex) | Преобразование шестнадцатеричного числа в десятичное | int octdec(string oct) | Преобразование восьмеричного числа в десятичное | int rand([int min, int max]) | Получить случайное число | void srand(int seed) | Инициализировать генератор случайных чисел | int getrandmax() | Получить максимальное число, возвращаемое rand | int mt_rand([int min, int max]) | Получить случайное число | void mt_srand(int seed) | Инициализировать генератор случайных чисел | int mt_getrandmax() | Максимальное число, возвращаемое mt_rand | double sqrt(double x) | Квадратный корень | double exp(double x) | Экспонента | double pow(double x, double y) | xy | double log(double x) | Натуральный логарифм | double log10(double x) | Десятичный логарифм | double pi() | p | double cos(double x) | Косинус | double sin(double x) | Синус | double tan(double x) | Тангенс | double acos(double x) | Арккосинус | double asin(double x) | Арксинус | double atan(double x) | Арктангенс | double atan2(double y, double x) | Арктангенс y/x | Обработка строк | void print(string str) | Вывести строку в стандартный поток вывода | int printf(string format, mixed arg, ...) | Форматированный вывод | string sprintf( string format, mixed arg, ...) | Форматировать строку | Продолжение табл. 12 | Функция | Описание | string addslashes( string str) | Экранирование символов "$", "\", "'" и 0 в строке str | string stripslashes( string str) | Удалить экранирующие символы из строки | string chr(int ascii) | Получить символ с заданным кодом | int ord(string ch) | Код символа | string convert_cyr_string( string str, string from, string to) | Перевод строки из одной русскоязычной кодировки в другую | void parse_str(string str) | Разбить строку запроса и создать соответствующие переменные | Обработка массивов | int count(mixed arr) | Число элементов массива | mixed current(array arr) | Текущий элемент массива | mixed pos(array arr) | Псевдоним current | array each(array arr) | Получить в виде массива пару ключ/значение текущего элемента arr | mixed key(array arr) | Ключ текущего элемента массива | mixed reset(array arr) | Установить внутренний указатель массива на начальный элемент | mixed prev(array arr) | Переместить указатель массива на предыдущий элемент | mixed next(array arr) | Переместить указатель массива на следующий элемент | mixed end(array arr) | Установить внутренний указатель массива на последний элемент | void sort(array arr) | Сортировка массива | void rsort(array arr) | Сортировка массива в обратном порядке | void asort(array arr) | Сортировка ассоциативного массива array | void arsort(array arr) | Сортировка ассоциативного массива arr в обратном порядке | int ksort(array arr) | Сортировка ассоциативного массива по ключам | Процессы | string exec( string command [, array output [, int return_code]] ) | Выполнить команду command оболочки UNIX. Стандартный вывод будет записан в массив строк output, код возврата – в переменную result_code. Возвращается последняя строка стандартного потока вывода | string system( string cmd [, int ret]) | Выполнить команду и возвратить результат | int chdir(string dir) | Изменить текущий рабочий каталог | void putenv(string str) | Установить значение переменной окружения | Продолжение табл. 12 | Функция | Описание | string getenv(string var) | Получить значение переменной окружения | void sleep(int sec) | Задержка выполнения текущего процесса на sec секунд | void usleep(int us) | Задержка выполнения текущего процесса на us микросекунд | int sem_get(int key [, int max [, int perm]]) | Получить идентификатор семафора | int sem_acquire(int sem) | Уменьшение счетчика семафора | int sem_release(int sem) | Увеличение счетчика семафора | Файлы и каталоги | int copy(string src, string dest) | Копировать файл | int rename(string old, string new) | Переименовать файл | int unlink( string filename) | Удалить файл | int readfile( strinf filename) | Прочитать текстовый файл в стандартное устройство вывода | array file(string filename) | Прочитать текстовый файл в массив строк | int filesize( string filename) | Размер файла | int file_exists( string filename) | TRUE, если файл существует | int fopen(string filename, string mode) | Открыть файл | string fgetc(int fd) | Прочитать символ из файла | string fgets(int fd, int maxlen) | Прочитать из файла строку максимальной длиной maxlen | int fputs(int fd, string str [, int length]) | Записать строку в файл | string fread(int fp, int len) | Бинарное чтение файла | int fwrite(int fd, string str, int len) | Бинарная запись в файл | int ftell(int fd) | Текущая позиция указателя | int fseek(int fd, int offset) | Переместить внутренний указатель файла | int rewind(int fd) | Переместить указатель файла на начало | int feof(int fd) | TRUE, если дескриптор fd указывает на конец файла | int fclose(int fd) | Закрыть файл | int popen( string command, string mode) | Запустить процесс command и возвратить дескриптор стандартного потока ввода или стандартного потока вывода созданного процесса | Продолжение табл. 12 | Функция | Описание | int pclose(int fd) | Закрыть поток, открытый popen | int mkdir(string dir, int mode) | Создать директорию | int rmdir(string dir) | Удалить директорию | int opendir(string dir) | Открыть директорию | string readdir(int fd) | Получить имя очередного файла в каталоге | void rewinddir(int fd) | Переместить указатель каталога на первый файл | void closedir(int fd) | Закрыть директорию | void clearstatcache() | Очистить файловый кэш | flush() | Очистка буфера стандартного вывода | int fsockopen(string host, int port) | Открыть сокет | Дата и время | int time() | Получить текущее время в формате UNIX | string date(string format, int timestamp) | Строковое представление локальной даты и времени в указанном формате | string gmdate( string format, int timestamp) | Преобразовать дату и время GMT в формате UNIX в форматированную строку | array getdate( int timestamp) | Преобразовать дату и время в ассоциативный массив | int mktime(int hour, int minute, int second, int month, int day, int year) | Дата и время в формате UNIX | int gmmktime(int hour, int minute, int second, int month, int day, int year) | Дата и время GMT в формате UNIX | TCP/IP, HTTP, CGI, PHP | string gethostbyname( string host) | Получить IP-адрес хоста | string gethostbyaddr( string addr) | Получить имя хоста по IP-адресу | int header(string hdr) | Отправить заголовок HTTP | string htmlspecialchars( string str) | Преобразовать специальные символы HTML в строке str в escape-последовательности | int isset() | TRUE, если переменная определена | void eval(string code) | Обработка code в качестве вложенного сценария | void exit() | Завершить текущий сценарий | Окончание табл. 12 | Функция | Описание | int phpinfo() | Вывод информации о текущей реализации PHP | string phpversion() | Вывод информации о текущей версии PHP | Более подробную информацию о встроенных функциях языка интерпретатора PHP можно найти в руководствах по этому языку. |