Операторы ветвления
Операторы этого типа позволяют принимать решение о выполнении тех или иных действий в зависимости от ситуации.
В Parser существует два оператора ветвлений: if, проверяющий условие и выполняющий одну из указанных веток, и switch, выполняющий поиск необходимой ветки, соответствующей заданной строке или значению заданного выражения.
Чтение
$cookie:имя_cookie
Возвращает значение cookie с указанным именем.
Чтение строки
$console:line
Такая конструкция считывает строку с консоли.
Класс console[3.1.2]
Класс предназначен для создания простых интерактивных служб, работающих в текстовом построчном режиме.
Работать такие службы могут в паре со стандартной UNIX программой inetd.
Например, можно на Parser реализовать news-сервер (NNTP).
Добавьте такую строку в ваш /etc/inetd.conf и перезапустите inetd:
nntp stream tcp nowait учетная_запись /путь/к/parser3 /путь/к/parser3 /путь/к/nntp.p
В скрипте nntp.p опишите ваш NNTP сервер.
Что даст возможность людям его использовать - nntp://ваш_сервер.
Класс cookie
Класс предназначен для работы с HTTP cookies.
Кодировки
Уверены, наличие разных кодировок доставляет вам такое же удовольствие, как и нам.
В Parser встроена возможность прозрачного перекодирования документов из кодировки, используемой на сервере в кодировку посетителя и обратно.
Parser перекодирует
· | данные форм; |
· | строки при преобразовании вида uri; |
· | текстовый результат обработки страницы. |
Кодировку, используемую вами в документах на сервере, вы задаете в поле $request:charset.
Кодировку, желаемую вами в результате - в $response:charset.
Сделать это необходимо в одном из auto методов.
Рекомендуем задавать кодировку результата в HTTP заголовке content-type, чтобы программа просмотра страниц знала о ней, и пользователю вашего сервера не нужно было переключать ее вручную.
$response:content-type[
$.value[text/html]
$.charset[$response:charset]
]
Кодировку текста отправляемых вами писем можно задать отличной от кодировке результата, см. ^mail:send[…].
При работе с базами данных необходимо задать кодировку, в которой общаться с SQL-сервером, см. Формат строки подключения.
Список допустимых кодировок определяется в Конфигурационном файле.
По умолчанию везде используется кодировка UTF-8.
Примечание: имя кодировки нечувствительно к регистру. [3.1]
в него значение Петя. Созданный
$cookie:user[Петя]
Создаст cookie с именем user и запишет в него значение Петя. Созданный cookie будет храниться на диске пользователя 90 дней.
Примечание: записанное значение сразу доступно для чтения.
$cookie:имя[
$.value[значение]
$.expires(число дней)
]
$cookie:имя[
$.value[значение]
$.expires[session]
]
$cookie:имя[
$.value[значение]
$.domain[имя домена]
]
$cookie:имя[
$.value[значение]
$.path[подраздел]
]
Сохраняет в cookie с указанным именем.
Необязательные модификаторы:
$.expires(число дней) - задает число дней (может быть дробным, 1.5=полтора дня), на которое сохраняется cookie;
$.expires[session] - создает сеансовый cookie (cookie не будет сохранятся, а уничтожится с закрытием окна браузера);
$.expires[$date] - задает дату и время, до которой будет храниться cookie, здесь $date - переменная типа date;
$.domain[имя домена] - задает cookie в домен с указанным именем;
$.path[подраздел] - задает cookie только на определенный подраздел сайта.
Создаст на две недели cookie
$cookie:login_name[
$.value[guest]
$.expires(14)
]
Создаст на две недели cookie с именем login_name и запишет в него значение guest.
записанные значения доступны для чтения
$cookie:my_cookie
Считывается и выдается значение cookie с именем my_cookie.
Примечание: записанные значения доступны для чтения сразу.
Сборка Parser из исходных кодов
Загрузите из CVS исходные коды Parser3 и необходимых дополнительных модулей. Для этого выполните следующую команду:
cvs -d :pserver:anonymous@cvs.parser.ru:/parser3project login
Пароль пустой.
cvs -d :pserver:anonymous@cvs.parser.ru:/parser3project get -r имя_ветки имя_модуля
Имя_ветки - если не указывать -r, вы получите текущую разрабатываемую версию.
Для получения стабильной версии, забирайте ветку «release_3_X_XXXX».
Имя модуля:
Имя основного модуля: parser3.
Модуль с SQL драйверами: sql.
Сейчас в нем доступны каталоги:
sql/mysql
sql/pgsql
sql/oracle
sql/odbc
Для компиляции под UNIX…
…варианта Parser в виде модуля Apache 1.3 необходимо сначала в каталоге с исходными кодами Apache исполнить команду
./configure
и только после этого собирать Parser.
Для компиляции под Win32…
…необходим каталог:
win32/tools
…SQL драйверов необходимы каталоги:
win32/sql/mysql
win32/sql/pgsql
win32/sql/oracle
…варианта Parser, работающего с XML, в файле parser3/src/include/pa_config_fixed.h необходима директива
#define XML
…варианта Parser, принимающего письма по электронной почте, в файле parser3/src/include/pa_config_fixed.h необходима директива
#define WITH_MAILRECEIVE
Пользователи UNIX/Cygwin, инструкции по компиляции и установке читайте в файлах INSTALL каждого модуля.
Для компиляции под Win32 используйте Microsoft Visual Studio (6.0 или новее), используйте файлы .dsw каждого модуля. Распаковывайте все модули в каталог parser3project, находящийся в корне (важно!) диска.
Запись
$cookie:имя[значение]
Сохраняет в cookie с указанным именем указанное значение на 90 дней.
Запись строки
$console:line[текст]
Такая конструкция выводит строку на консоль.
Calendar. Создание календаря на заданную неделю месяца
^date:calendar[rus|eng](год;месяц;день)
Метод формирует таблицу с календарем на одну неделю заданного месяца года. Для определения недели используется параметр день. Параметр rus|eng также как и в предыдущем методе определяет формат календаря. С параметром rus дни недели начинаются с понедельника, c eng - с воскресенья.
Calendar. Создание календаря на заданный месяц
^date:calendar[rus|eng](год;месяц)
Метод формирует таблицу с календарем на заданный месяц года. Параметр rus|eng определяет формат календаря. С параметром rus дни недели начинаются с понедельника, c eng - с воскресенья.
Create. Дата или время в стандартном для СУБД формате
^date::create[год]
^date::create[год-месяц]
^date::create[год-месяц-день]
^date::create[год-месяц-деньчасов]
^date::create[год-месяц-день часов:минут]
^date::create[год-месяц-день часов:минут:секунд]
^date::create[год-месяц-день часов:минут:секунд.миллисекунд] [3.1.3]
^date::create[часов:минут]
^date::create[часов:минут:секунд]
Создает объект класса date, содержащий значение произвольной даты и/или времени с точностью до секунды. Обязательными частями строки-параметра являются значение года или часа и минуты. месяц, день, часов, минут, секунд, миллисекунд являются необязательными, если не заданы, подставляются первый день, нулевые час, минута, секунда или текущий день.
Замечание: значение миллисекунд игнорируется.
Удобно использовать этот конструктор для работы с датами, полученными их базы данных, ведь из запроса вы получите значения полей с датой, временем или и датой и временем в виде строк.
Create. Относительная дата
^date::create(количествосуток после EPOCH)
Конструктор с одним параметром предназначен для задания относительных значений дат. Имея объект класса date, можно сформировать новый объект того же класса с датой, смещенной относительно исходной.
Create. Произвольная дата
^date::create(year;month)
^date::create(year;month;day)
^date::create(year;month;day;hour;minute;second)
Создает объект класса date, содержащий значение произвольной даты с точностью до секунды. Обязательными параметрами конструктора являются значения года и месяца. Параметры конструктора day,hour, minute, second являются необязательными, если не заданы, подставляются первый день, нулевые час, минута, секунда.
DOM. nodeType
DOM-элементы бывают разных типов, тип элемента хранится в integer поле nodeType.
В классе xdoc имеются следующие константы, удобные для проверки значения этого поля:
$xdoc:ELEMENT_NODE= 1
$xdoc:ATTRIBUTE_NODE = 2
$xdoc:TEXT_NODE = 3
$xdoc:CDATA_SECTION_NODE = 4
$xdoc:ENTITY_REFERENCE_NODE = 5
$xdoc:ENTITY_NODE = 6
$xdoc:PROCESSING_INSTRUCTION_NODE = 7
$xdoc:COMMENT_NODE = 8
$xdoc:DOCUMENT_NODE = 9
$xdoc:DOCUMENT_TYPE_NODE = 10
$xdoc:DOCUMENT_FRAGMENT_NODE = 11
$xdoc:NOTATION_NODE = 12
Класс date
Класс date предназначен для работы с датами. Возможные варианты использования - календари, всевозможные проверки, основывающиеся на датах и т.п.
Диапазон возможных значений - от 01.01.1970 до 01.01.2038 года.
Не забывайте, что в нашем календарном времени есть разрывы и нахлесты: во многих странах принято так-называемое «летнее» время, когда весной часы переводят вперед, а осенью назад.
Скажем, в Москве не бывает времени «02:00, 31 марта 2002», а время «02:00, 27 октября 2002» бывает дважды.
Числовое значение объекта класса date равно числу суток с EPOCH (01.01.1970 00:00:00, UTC) до даты, заданной в объекте. Этим значением полезно пользоваться для вычисления относительной даты, например:
# проверка "обновлен ли файл позже, чем неделю назад?"
^if($last_update > $now-7){
новый
}{
старый
}
Число суток может быть дробным, скажем, полтора дня = 1.5.
Обычно класс оперирует локальными датой и временем, однако можно узнать значение хранимой им даты/времени в произвольном часовом поясе, см. ^date.roll[TZ;…].
Для общения между компьютерами, работающими в разных часовых поясах, удобно обмениваться значениями даты/времени, не зависящими от пояса - здесь очень удобен UNIX формат, представляющий собой число секунд, прошедших с EPOCH.
Unix формат можно использовать в JavaScript и ряде других языков сценариев, работающих в браузере.
Parser полностью поддерживает работу с UNIX форматом дат.
Now. Текущая дата
^date::now[]
^date::now(смещениев днях)
Конструктор создает объект класса date, содержащий значение текущей даты с точностью до секунды, используя системное время сервера. Если указано, то плюс смещение в днях.
Используется локальное время той машины, где работает Parser (локальное время сервера). Для того, чтобы узнать время в другом часовом поясе, используйте ^date.roll[TZ;…].
Определение методов и пользовательских операторов
@имя[параметры]
тело
@имя[параметры][локальные переменные]
тело
Метод, это блок кода, имеющий имя, принимающий параметры, и возвращающий результат. Имена параметров метода перечисляются через точку с запятой. Метод также может иметь локальные переменные, которые необходимо объявить в заголовке метода, после объявления параметров, имена разделяются точкой с запятой.
Локальные переменные видны в пределах оператора или метода, и изнутри вызываемых ими операторов и методов, см. ниже $caller.
При описании метода можно пользоваться не только параметрами или локальными переменными, а также любыми другими именами, при этом вы будете работать с полями класса, или полями объекта, в зависимости от того, как был вызван определенный вами метод, статически, или динамически.
В Parser вы можете расширить базовый набор операторов, операторами в Parser считаются методы класса MAIN.
Определение пользовательского класса и операторов
Файл в таком формате определяет пользовательский класс:
@CLASS
имя_класса
#необязательно
@USE
файл_с_родительским классом
# необязательно
@BASE
имя_родительского_класса
# так рекомендуется называть метод-конструктор класса
@create[параметры]
# далее следуют определения методов класса
@method1[параметры]
…
Модуль можно подключить (см. «Подключение модулей») к произвольному файлу - там появится возможность использования определенного здесь класса.
Если не указать @CLASS, файл определит ряд дополнительных операторов.
Если определен метод…
@auto[]
…он будет выполнен автоматически при загрузке класса как статический метод (так называемый статический конструктор). Используется для инициализации статических полей (переменных) класса.
Примечание: результат работы метода игнорируется - никуда не попадает.
У метода auto может быть объявлен параметр:
@auto[filespec]
В этом параметре Parser передаст полное имя файла, содержащего метод.
В Parser создаваемые классы наследуют методы классов, от которых были унаследованы. Унаследованные методы можно переопределить.
В том случае, когда в качестве родительского класса выступает другой пользовательский класс, необходимо подключить модуль, в котором он находится, а также объявить класс базовым (@BASE).
Для того, чтобы пользоваться методами и полями родительских классов, необходимо использовать следующие конструкции:
^класс:метод[параметры] - вызов метода родительского класса (примечание: хотя такой синтаксис вызова метода и похож на синтаксис вызова статического метода, фактически, в случае динамического метода, происходит динамический вызов метода родительского класса), для обращения к своему ближайшему родительскому классу (базовому классу) можно использовать конструкции ^BASE::конструктор[параметры] и ^BASE:метод[параметры].
Поля объектов класса date
Через поля объектов класса date могут быть получены следующие величины:
$date.monthмесяц
$date.year год
$date.day день
$date.hour часы
$date.minute минуты
$date.second секунды
$date.weekday день недели (0 - воскресенье, 1 - понедельник, …)
$date.yearday день года (0 - 1-ое января, 1 - 2-ое января, …)
$date.daylightsaving 1 - летнее время, 0 - стандартное время
$date.TZ часовой пояс; [3.1.1]
содержит значение, если эта дата была получена ^date.roll[TZ;…]
с календарем на ту неделю
$week_of_month[^date:calendar[rus](2001;11;30)]
В результате в переменную $week_of_month будет помещена таблица с календарем на ту неделю ноября 2001 года, которая содержит 30-е число. Формат таблицы следующий:
year |
month |
day |
weekday |
2001 |
11 |
26 |
01 |
2001 |
11 |
27 |
02 |
2001 |
11 |
28 |
03 |
2001 |
11 |
29 |
04 |
2001 |
11 |
30 |
05 |
2001 |
12 |
01 |
06 |
2001 |
12 |
02 |
07 |
$president_on_tv_at[^date::create(2001;12;31;23;55)]
В результате выполнения данного кода, создается объект класса date, значения полей которого соответствуют времени появления президента на телевизионном экране в комнате с веб-сервером.
$now[^date::now[]]
$date_after_week[^date::create($now+7)]
В примере получается дата, на неделю большая текущей.
Параметр конструктора не обязательно должен быть целым числом.
$date_after_three_hours[^date::create($now+3/24)]
# считаем новыми статьи за последние 3 дня
$new_after[^date::now(-3)]
$articles[^table::sql{select id, title, last_update from articles where …}]
^articles.menu{
$last_update[^date::create[$articles.last_update]]
<a href=${articles.id}.html>$articles.title</a>
^if($last_update > $new_after){новая}
<br>
}
Внимание пользователям Oracle: чтобы получать дату и время в удобном формате, в строке соединения с сервером укажите формат даты и времени, рекомендованный в Приложении 3.
$date_now[^date::now[]]
$date_now.year<br>
$date_now.month<br>
$date_now.day<br>
$date_now.hour<br>
$date_now.minute<br>
$date_now.second<br>
$date_now.weekday
В результате выполнения данного кода, создается объект класса date, содержащий значение текущей даты, а на экран будет выведено значение:
год
месяц
день
час
минута
секунда
день недели
$date_now[^date::now[]]
$date_now.month
В результате выполнения данного кода, создается объект класса date, содержащий значение текущей даты, а на экран будет выведен номер текущего месяца.
$date_now[^date::now[]]
^connect[строка подключения]{
^void:sql{insert into access_log
(access_date)
values
('^date_now.sql-string[]')
}
}
Получаем строку вида '2001-11-30 13:09:56' с текущей датой и временем, которую сразу помещаем в колонку таблицы СУБД. Без использования данного метода пришлось бы выполнять необходимое форматирование вручную. Обратите внимание, данный метод не формирует кавычки, их требуется задавать вручную.
^if($node.nodeType == $xnode:ELEMENT_NODE){
<$node.tagName>
}
В результате выполнения данного кода,
$president_on_tv_at[^date::create(2001;12;31;23;55)]
В результате выполнения данного кода, создается объект класса date, значения полей которого соответствуют времени появления президента на телевизионном экране в комнате с веб-сервером.
В примере получается дата, на
$now[^date::now[]]
$date_after_week[^date::create($now+7)]
В примере получается дата, на неделю большая текущей.
Параметр конструктора не обязательно должен быть целым числом.
$date_after_three_hours[^date::create($now+3/24)]
Внимание пользователям Oracle: чтобы получать
# считаем новыми статьи за последние 3 дня
$new_after[^date::now(-3)]
$articles[^table::sql{select id, title, last_update from articles where …}]
^articles.menu{
$last_update[^date::create[$articles.last_update]]
<a href=${articles.id}.html>$articles.title</a>
^if($last_update > $new_after){новая}
<br>
}
Внимание пользователям Oracle: чтобы получать дату и время в удобном формате, в строке соединения с сервером укажите формат даты и времени, рекомендованный в Приложении 3.
В результате выполнения данного кода,
$date_now[^date::now[]]
$date_now.year<br>
$date_now.month<br>
$date_now.day<br>
$date_now.hour<br>
$date_now.minute<br>
$date_now.second<br>
$date_now.weekday
В результате выполнения данного кода, создается объект класса date, содержащий значение текущей даты, а на экран будет выведено значение:
год
месяц
день
час
минута
секунда
день недели
В результате выполнения данного кода,
$date_now[^date::now[]]
$date_now.month
В результате выполнения данного кода, создается объект класса date, содержащий значение текущей даты, а на экран будет выведен номер текущего месяца.
и временем, которую сразу помещаем
$date_now[^date::now[]]
^connect[строка подключения]{
^void:sql{insert into access_log
(access_date)
values
('^date_now.sql-string[]')
}
}
Получаем строку вида '2001-11-30 13:09:56' с текущей датой и временем, которую сразу помещаем в колонку таблицы СУБД. Без использования данного метода пришлось бы выполнять необходимое форматирование вручную. Обратите внимание, данный метод не формирует кавычки, их требуется задавать вручную.
^if($node.nodeType
^if($node.nodeType == $xnode:ELEMENT_NODE){
<$node.tagName>
}
Пример сдвига часового пояса
@main[]
$now[^date::now[]]
^show[]
^show[Москва;MSK-3MSD]
^show[Амстердам;MET-1DST]
^show[Лондон;GMT0BST]
^show[Нью-Йорк;EST5EDT]
^show[Чикаго;CST6CDT]
^show[Денвер;MST7MDT]
^show[Лос-Анжелес;PST8PDT]
@show[town;TZ]
^if(def $town){
$town
^now.roll[TZ;$TZ]
}{
Локальное время сервера
}
<br>
$now.year/$now.month/$now.day, $now.hour ч. $now.minute мин.<hr>
Пример сдвига месяца
$today[^date::now[]]
^today.roll[month](-1)
$today.month
В данном примере мы присваиваем переменной $today значение текущей даты и затем уменьшаем номер текущего месяца на единицу. В результате мы получаем номер предыдущего месяца.
Работа с переменными в динамических методах
Поиск значения переменной происходит в:
· | в списке локальных переменных; |
· | в текущем объекте и его классе; |
· | в родительских объектах и их классах. |
Запись значения переменной производится в уже имеющуюся переменную (см. область поиска выше), если таковая имеется. В противном случае создается новая переменная (поле) в текущем объекте.
Примечание: старайтесь всячески избегать использования полей класса не из методов класса, кроме простейших случаев! По-возможности, общайтесь с объектом только через его методы.
Работа с переменными в статических методах
Поиск значения переменной происходит в:
· | в списке локальных переменных; |
· | в текущем классе или его родителях. |
Запись значения переменной производится в уже имеющуюся переменную (см. область поиска выше), если таковая имеется. В противном случае создается новая переменная (поле) в текущем классе.
Roll. Сдвиг даты
^date.roll[year](смещение)
^date.roll[month](смещение)
^date.roll[day](смещение)
^date.roll[TZ][Новыйчасовой пояс] [3.1.1]
С помощью этого метода можно увеличивать/уменьшать значения полей year, month, day объектов класса date.
Также можно узнать дату/время, соответствующие хранящимся в объекте класса date в другом часовой поясе, задав системное имя нового часового пояса. Список имен см. в документации на вашу операционную систему, ключевые слова: «Переменная окружения TZ».
Системная переменная: caller
Все методы и операторы имеют локальную переменную caller, которая хранит «контекст вызова» метода или оператора.
Через нее можно:
· | узнать, кто вызвал вызвавший описываемый метод или оператор, обратившись к $caller.self;
|
· | считать - $caller.считать, или записать - $caller.записать[значение] переменную, как будто вы находитесь в том месте, откуда вызвали описываемый метод или оператор. |
Например вам нужен оператор, похожий на системный for, но чем-то отличающийся от него. Вы можете написать его сами, воспользовавшись возможностью менять локальную переменную с именем, переданным вам, в контексте вызова вашего оператора.
@steppedfor[name;from;to;step;code]
$caller.$name($from)
^while($caller.$name<=$to){
$code
^caller.$name.inc($step)
}
Теперь такой вызов…
@somewhere[][i]
^steppedfor[i](1;10;2){$i }
…напечатает «1 3 5 7 9 », обратите внимание, что изменяется локальная переменная метода somewhere.
Примечание: возможность узнать контекст вызова удобна для задания контекста компиляции кода (см. «process. Компиляция и исполнение строки».
Системная переменная: result
Все методы и операторы имеют локальную переменную result. Если ей присвоить какое-то значение, то именно оно будет результатом выполнения метода. Значение переменной result можно считывать и использовать в вычислениях.
Пример:
@main[]
$a(2)
$b(3)
$summa[^sum[$a;$b]]
$summa
@sum[a;b]
^eval($a+$b)
$result[Ничегоне скажу!]
Здесь клиенту будет выдана строка Ничего не скажу!, а не результат сложения двух чисел.
Важно: операторы, это методы класса MAIN, но в отличие от методов других классов, их можно вызвать из любого класса просто по имени, т.е. можно писать ^include[…], вместо громоздкого ^MAIN:include[…].
Системная переменная: self
Все методы и операторы имеют локальную переменную self, она хранит ссылку на текущий объект, в статических методах хранит то же, что и $CLASS.
Пример:
@main[]
$a[Статическое поле ^$a класса MAIN]
^test[Параметр метода]
@test[a]
^$a - $a <br>
^$self.a - $self.a
Выведет:
$a - Параметр метода
$self.a - Статическое поле $a класса MAIN
Системное поле класса: CLASS
$имя_класса:CLASS - хранит ссылку на класс объекта.
Это удобно при задании контекста компиляции кода (см. «process. Компиляция и исполнение строки».
По этой ссылке также доступны статические поля класса, пример:
@main[]
^method[$cookie:CLASS]
@method[storage]
$storage.field
Этот код напечатает значение $cookie:field.
Sql-string. Преобразование даты
^date.sql-string[]
Метод преобразует дату к виду ГГГГ-ММ-ДДЧЧ:ММ:СС, который принят для хранения дат в СУБД. Использование данного метода позволяет вносить в базы данных значения дат без дополнительных преобразований.
Unix-timestamp. Дата и время в UNIX формате[3.1.2]
^date::unix-timestamp(дата_время_в_UNIX_формате)
Конструктор создает объект класса date, содержащий значение, соответствующее переданному числовому значению в UNIX формате (см. также краткое описание).
Unix-timestamp. Преобразование
^date.unix-timestamp[]
Преобразует дату и время к значению в UNIX формате (см. краткое описание).
Класс env
Класс предназначен для получения значения переменных окружения. Со списком стандартных переменных окружения можно ознакомиться по адресу http://www.w3c.org/cgi. Веб-сервер Apache задает значения ряда дополнительных переменных.
Литералы в выражениях
Если строка содержит пробелы, то в выражении ее нужно заключать в кавычки или апострофы.
Пример:
^if($name eq Вася)
Здесь Вася - строка, которая не содержит пробелов, поэтому ее можно не заключать в кавычки или апострофы.
^if($name eq "Вася Пупкин")
Здесь строка содержит пробелы, поэтому заключена в кавычки.
Обработка ошибок
Человек несовершенен. Вы должны быть готовы к тому, что вместо ожидаемого, на экране вашего компьютера появится сообщение об ошибке. Избежать этого, к сожалению, почти невозможно. На начальном этапе сообщения об ошибках будут довольно частыми. Основной причиной ошибок сначала, вероятнее всего, будут непарные скобки (помните, мы говорили о текстовых редакторах, помогающих их контролировать?) и ошибки в записи конструкций Parser.
Если в ходе работы возникла ошибка, обычно обработка страницы прекращается, происходит откат (rollback) по всем активным на момент ошибки SQL-соединениям, и, вместо того вывода, который должен был попасть пользователю, вызывается метод unhandled_exception, ему передается информация об ошибке и стек вызовов, приведших к ошибке, и выдаются результаты его работы. Также ошибка записывается в журнал ошибок веб-сервера.
Однако часто желательно перехватить возникшую ошибку, и сделать нечто полезное вместо ошибочного кода.
Допустим, вы хотите проверить на правильность XML код, полученный из ненадежного источника. Здесь прерывание обработки страницы вам совершенно ни к чему, наоборот - вы ожидаете ошибку определенного типа и хотите ее обработать.
Parser с радостью идет навстречу, и дает вам в руки мощный инструмент: оператор try.
При сложной обработке данных часто выясняется, что имеет место ошибка в методе, вызванном из другого, а тот, в свою очередь, из третьего. Как в такой ситуации просто сообщить и обработать ошибку?
Используйте оператор throw, чтобы сообщить об ошибке, и обработайте ошибку на верхнем уровне - и вам не придется проверять ее на всех уровнях вложенности вызовов методов.
Также во многих ситуациях сам Parser или его системные классы сообщают о ошибках, см. «Системные ошибки».
Операторы в выражениях и их приоритеты
Операторы в таблице перечислены в порядке убывания приоритета:
Оператор |
Значение | |
высший приоритет | ||
() |
Группировка частей выражения | |
! |
Логическая операция NOT | |
~ |
Побитовая инверсия (NOT) | |
- |
Одиночный минус | |
* |
Умножение | |
/ |
Деление |
Внимание, |
\ |
Целочисленное деление |
деление на ноль |
% |
Остаток от деления |
дает ошибку number.zerodivision. |
+ |
Сложение | |
- |
Вычитание | |
<< |
Побитовый сдвиг влево | |
>> |
Побитовый сдвиг вправо | |
& |
Побитовая операция AND | |
| |
Побитовая операция OR | |
!| |
Побитовая операция XOR | |
is |
Проверка типа | |
def |
Определен ли объект? | |
in |
Находится ли текущий документ в каталоге? | |
-f |
Существует ли файл? | |
–d |
Существует ли каталог? | |
== |
Равно | |
!= |
Неравно | |
eq |
Строки равны | |
ne |
Строки не равны | |
< |
Меньше | |
> |
Больше | |
<= |
Меньше или равно | |
>= |
Больше или равно | |
lt |
Строка меньше | |
gt |
Строка больше | |
le |
Строка меньше или равна | |
ge |
Строка больше или равна | |
&& |
Логическая операция AND |
второй операнд не вычисляется, если первый - ложь |
|| |
Логическая операция OR |
второй операнд не вычисляется, если первый - истина |
!|| |
Логическая операция XOR | |
низший приоритет |
Получение значения поля запроса
$env:HTTP_ПОЛЕ_ЗАПРОСА
Такая конструкция возвращает значение поля запроса, передаваемое браузером веб-серверу (по HTTP протоколу).
Поля запроса имеют имена
^if(^env:HTTP_USER_AGENT.pos[MSIE]>=0){
Пользователь, вероятно, использует MicroSoft Internet Explorer<br>
}
Поля запроса имеют имена в верхнем регистре и начинающиеся с HTTP_, и знаки '-' в них заменены на '_'.
Подробности в документации на ваш веб-сервер.
$env:REMOTE_ADDR
Возвратит IP-адрес машины, с которой был запрошен документ.
с которой был запрошен
$env:REMOTE_ADDR
Возвратит IP-адрес машины, с которой был запрошен документ.
Статические поля. Получение значения переменной окружения
$env:переменная_окружения
Возвращает значение указанной переменной окружения.
@Unhandled_exception. Вывод необработанных ошибок
Если ошибка так и не была обработана ни одним обработчиком (см. оператор try), Parser вызывает метод unhandled_exception, ему передается информация об ошибке и стек вызовов, приведших к ошибке, и выдаются результаты его работы. Также ошибка записывается в журнал ошибок веб-сервера.
Хороший тон, это оформить сообщение об ошибке в общем дизайне вашего сайта.
А также проверить, и не показывать технические подробности вашим посетителям.
Рекомендуем поместить этот метод в Конфигурационный файл сайта.