А что это вообще такое?

         

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



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

В 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, ему передается информация об ошибке и стек вызовов, приведших к ошибке, и выдаются результаты его работы. Также ошибка записывается в журнал ошибок веб-сервера.

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

Рекомендуем поместить этот метод в Конфигурационный файл сайта.