- •Алматы, 2012
- •5В070300 - «Ақпараттық жүйелер»(бакалавриат) мамандығы бойынша «Windows-та бағдарламалау және hci» пәнінен жұмыс оқулық жоспар бойынша құрастырылған.
- •Алматы, 2012
- •5В070300 - «Ақпараттық жүйелер»(бакалавриат) мамандығы бойынша «Windows-та бағдарламалау және hci» пәнінен жұмыс оқулық жоспар бойынша құрастырылған.
- •Рабочая учебная программа
- •Алматы, 2012
- •Пояснительная записка
- •Краткое описание дисциплины
- •Темы и содержание семинарских (практических) занятий
- •Основная часть тематика лекционных занятий
- •Темы и содержание лабораторных занятий
- •Тематика срсп
- •Тематика срс
- •Список рекомендуемой литературы:
- •Силлабус (sillabus)
- •Алматы, 2012
- •Пояснительная записка
- •Общие данные по рабочей программе
- •Краткое описание дисциплины
- •Основная часть тематика лекционных занятий
- •Темы и содержание семинарских (практических) занятий
- •Темы и содержание лабораторных занятий
- •Тематика срсп
- •Тематика срс
- •Список рекомендуемой литературы:
- •Темы и продолжительность их изучения
- •Задания самостоятельной работы:
- •Тематика и график сдачи срсп
- •График сдачи срс и время консультаций
- •Перечень срс по курсу
- •Вопросы для проведения контроля
- •Информация по оценке знаний
- •Критерии оценки (обобщенные)
- •Определение итоговой оценки по вск
- •Процедура апелляции
- •Требования преподавателя Политика и процедуры курса
- •График выполнения и сдачи заданий по дисциплине
- •График сдачи срс и время консультаций
- •Перечень срс по курсу
- •Лекционный комплекс-контент (тезисы лекций, иллюстративный и раздаточный материал, список рекомендуемой литературы) «программирование в windows и hci»
- •Алматы, 2012 Лекция 1. Введение в php. Основы синтаксиса языка php.
- •План лабораторных занятий
- •Лабораторная работа 1 - Создание и вывод переменных
- •Лабораторная работа 2 – Арифметические, логические операторы
- •Лабораторная работа 3 - Конструкции if, else и elseif
- •Лабораторная работа 4 - Цикл for
- •Лабораторная работа 5 - Таблица умножения
- •Лабораторная работа 6 - Массивы
- •Лабораторная работа 7 - Навигационное меню.
- •Лабораторная работа 8 - Практическое использование функций
- •Лабораторная работа 9 - Работа с функциями. Область видимости переменных.
- •План семинарских (практических) занятий
- •Практическая работа № 2 Использование основных операторов
- •Практическая работа № 3 Использование функций
- •Практическая работа № 4 Работа с формами
- •Лабораторная работа № 5 Работа со строками и заголовком html документа
- •Практическая работа № 6 Принципы Объектно-ориентированного программирования
- •Практическая работа № 7 Работа с датой Основы работы с базами данных на примере MySql
- •Практическая работа № 8 Работа с изображениями. Работа с регулярными выражениями. Работа с cookies Работа с сессиями
- •План лабораторных занятий
- •Лабораторная работа 1 - Создание и вывод переменных
- •Основы php Лабораторная работа 7 - Практическое использование функций
- •Лабораторная работа 7 - Работа с функциями. Область видимости переменных.
- •План семинарских (практических) занятий
- •Методические рекомендации по изучению дисциплины
- •(По работе с учебно-методическим комплексом) Основания, целевая аудитория и ориентированность учебно-методического комплекса
- •Рекомендуемый порядок работы с учебно-методическим комплексом
- •Программное и мультимедийное сопровождение учебных занятий по дисциплине «Алгоритмы, структуры данных и программирование»
- •Программные средства обеспечения дисциплины:
- •Электронные учебники:
- •Перечень специализированных аудиторий, кабинетов и лабораторий
- •Карта обеспеченности дисциплины учебной и учебно-методической литературой
Практическая работа № 8 Работа с изображениями. Работа с регулярными выражениями. Работа с cookies Работа с сессиями
Задание
· В Вашей папке находящейся в корневой директории web-сервера создайте
документ с названием l8.php.
· Задайте ему кодировку UTF-8.
Все дальнейшие операции проводить в этом документе. При необходимости
перезагружать документ (кнопка F5) для демонстрации сессий и cookie.
Работа с изображениям
· В дополнении к лабораторной работе взять файл с логотипом TSI (tsi.png) и
используя функции РНР написать на нём свою фамилию (кириллицей) в нижней
части изображения. Использовать шрифт 12 размера и отличный от чёрного цвет.
Также использовать для этого шрифт “BOOKOS.TTF” который также доступен для
скачивания в материалах к этой работе (либо другой TTF файл).
Работа с регулярными выражениями
· Создать переменную, содержащую произвольный текст, в произвольном месте
этого текста должны присутствовать ноли или более адресов электронной почты.
Проверить эту строку на наличие электронного адреса с использованием
следующего шаблона регулярного выражения: /^([a-zA-Z0-9\._\+-]+)\@((\[?)[azA-
Z0-9\-\.]+\.([a-zA-Z]{2,7}|[0-9]{1,3})(\]?))$/
(для проверки синтаксиса электронного адреса можно использовать много
различных вариантов регулярных выражений, в данном случае просто
используется один из них) как вариант возможно использовать следующее
выражение: /[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i
· Ввести другой текст, содержащий ноль или более телефонных номеров в формате
ххх-хх-хх (где х – любая произвольная цифра). Проверить наличие телефонных
номеров во введённом тексте используя следующий шаблон регулярного
выражения: /\d{3}-\d{2}-\d{2}/m
Работа с cookies
Задать cookie с использованием следующей функции:
setcookie("curLng", "eng", time()+3600);
проверить наличие cookies переменной curLng и если она определена, то вывести
сообщение о том, что текущий язык установлен на основе значения из Cookie.
$_COOKIE["curLng "];
Работа с сессиями
Создать сессию, занести в неё значение visits равное 1. Если сессия уже создана, то
нужно увеличить значение visits на 1. И вывести полученное значение, с текстом:
Обновление страницы номер №: n, где n – значение из сессии visits.
Дополнительные информационные материалы к лабораторной работе
Работа с изображениями
Пример: Создание пустого изображения, заполнение его белым цветом, вывод текста на
созданное изображение и вывод изображения в браузер в формате PNG.
Обратите внимание, что текст для вывода можно задавать с помощью параметра GET в
адресной строке скрипта.
header("Content-type: image/png");
$im = imagecreatetruecolor(400, 30);
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);
if(!isset($_GET['text']){
$text = 'Осипов...';
}else{
$text = $_GET['text'];
}
$font = 'BOOKOS.TTF';
imagettftext($im, 20, 0, 14, 24, $grey, $font, $text);
imagettftext($im, 20, 0, 11, 21, $black, $font, $text);
imagepng($im);
imagedestroy($im);
Пример: Загрузка изображения из файла и применение к нему эффекта скручивания.
$image = imagecreatefrompng('tsi.png');
$emboss = array(array(2, 0, 0), array(0, -1, 0), array(0, 0, -1));
imageconvolution($image, $emboss, 1, 127);
header('Content-Type: image/png');
imagepng($image, null, 9);
Работа с регулярными выражениями
Пример: проверка текста на наличие корректного web адреса.
$str = "http://wwwtsilv";
$pattern = "^(http|ftp|https)://(www\.)?.+\.([a-zA-Z]{2,7})$^";
echo preg_match ($pattern,$str)."<br />";
Работа с сессиями
Пример: Создание новой сессии, в случае, если она не была создана ранее
if(!session_id()){session_start();}
Пример: Работа с переменными в сессии.
$_SESSION[‘curLng’] = “eng”;
echo $_SESSION[‘curLng’];
Лекция 13. Создание –приложений
Эта строка присвоит значение дня недели (в цифровой форме от 0 до 6)переменной $MonthStart для месяца и года. Так как первый день месяца былиспользован при задании временной метки, данный код определит этот конкретный день. Таким образом удастся узнать, с какого дня недели начинается месяц: с понедельника, вторника и т.д.
10. Проследите, чтобы значение переменной $MonthStart не было нулевым.
if ($MonthStart == 0) {
$MonthStart = 7;
}
Если значение переменной $MonthStart равно нулю, это означает, что месяц начинается с воскресенья и у нас будут проблемы с использованием данного числа при выполнении сценария. Чтобы избежать проблем, заменим ноль семеркой.
11. Определите последний день месяца.
$LastDay = date("d", mktime (0, 0, 0, $Month+l, 0, $Year)) ;
Переменной $LastDay будет присвоено цифровое значение (например, 31,28 или 30), равное последнему дню месяца. Это определено использованием нулевого дня и следующего месяца ($Month+l) в функции mktime (}.
12. Задайте начальную дату как первый день месяца.
$StartDate = -$MonthStart;
Так как календарь будет начинаться с воскресенья, необходимо определить, какое количество дней пропустить до первого дня месяца. Если первый день месяца- вторник, значение $MbnthStart равно 2, следовательно, значение $startDate равно -2, то есть будут созданы два пустых дня до начала месяца.
13. Напишите цикл, который станет печатать строки календаря (недели).
for ($k = 1; $k <= 6; $k++) {
print ("<TR BGCOLOR=WHITE>");
В календаре будет 6 строк, поэтому цикл исполнит этот раздел кода 6 раз.
14. Создайте второй цикл, который будет печатать колонки календаря (дни).
for ($i = 1; $i <= 7; $i++) {
В календаре будет 7 колонок, одна на каждый день недели.
15. Увеличьте значение переменной $StartDate на единицу.
$StartDate++;
Значение переменной $startDate печатает дату для каждого дня календаря. Поэтому любая итерация цикла увеличивает это значение 16. Создайте условную конструкцию for, которая будет определять, когда пе-
чатать строку $StartDate.
if (($StartDate <= 0) || ($StartDate > $LastDay)) {
print ("<TD BGCOLOR=GREEN> </TD>");
} el'seif (($StartDate >= 1) && ($StartDate <= $LastDay)) {
print ("<TD ALIGN=CENTER>$StartDate</TD>");
}
Если значение переменной $StartDate меньше нуля (другими словами, месяц еще не начался) или больше количества дней в месяце ($LastDate), на экране монитора будет отображена пустая зеленая область. В том случае если значение переменной $StartDate больше нуля, но меньше количества дней в месяце ($LastDate), будет напечатана дата.
17. Закройте второй цикл, строку таблицы и первый цикл.
}
print ("</TR>\n");
}
18. Закончите таблицу.
print ("</TABLE>\n");
19. А теперь сделаем простую HTML-форму, которая передает страницу обратно в себя.
print ("<FORM ACTION=\"calendar.php\" METHOD=GET>\n");
20. Создайте два ниспадающих меню: одно для месяца, другое для года.
print ("Select a new month to view:\n");
print ("<SELECT NAME=Month>
-<OPTION VALUE=l>January</OPTION>\n
-<OPTION VALUE=2>February</OPTION>\n
-<OPTION VALUE=3>March</OPTION>\n
-<OPTION VALUE=4>April</OPTION>\n
-<OPTION VALUE=5>May</OPTION>\n
-«DPTION VALUE=6>June</OPTION>\n
-<OPTION VALUE=7>July</OPTION>\n
-<OPTION VALUE=8>August</OPTION>\n
-<OPTION VALUE=9>September</OPTION>\n
-«DPTION VALUE=10>October</OPTION>\n
-<OPTION VALUE=ll>November</OPTION>\n
-<OPTION VALUE=12>December</OPTION>\n</SELECT>\n") ;
print ("<SELECT NAME=Year>
-<OPTION VALUE=2001>2001</OPTION>\n
-<OPTION VALUE=2002>2002</OPTION>\n
-<OPTION VALUE=2003>2003</OPTION>\n
-</SELECT>\n");
Вы можете задать здесь любые годы. Обратите внимание, что два представленных меню сгенерируют переменные $Month и $Year, как только форма будет передана. И с этого времени благодаря условной конструкции, начинающейся со строки 5, новые значения будут использоваться вместо значений по умолчанию.
21. Создайте кнопку Submit и закройте форму.
print •("< INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"Submiti\">\n");
print ("</FORM>\n");
22. Включите файл нижнего колонтитула и закройте тэг РНР.
require ("footer.php");
?>
Сохраните сценарий как calendar.php (листинг 13.5), загрузите его на сервер и протестируйте в браузере.
Использование HTTP-заголовков
Заголовок HTTP (протокола передачи гипертекста) используется для передачи информации между сервером и клиентом (Web-браузером). Обычно эта информация существует в форме HTML, вот почему адреса Web-страниц начинаются с записи http://.
HTTP-заголовки - это достаточно сложная тема, которая заслуживает отдельного рассмотрения. HTTP-заголовки могут использоваться в разных целях.
В языке РНР доступ к деталям протокола HTTP выполняется через специальную функцию header (). Одна из задач, выполняемых с помощью этой функции, - переадресация пользователя с одной страницы на другую. (Дополнительную информацию по этому вопросу вы можете получить по адресу http://
www.w3.org/ProtocoIs/rfc2616/rfc2616.)
Для переадресации пользователя применяется следующий код:
header("Location:page.php");
Функцию заголовка разрешается использовать и для отправки cookie-файлов в целях дублирования функции setcookie (), которая иногда выдает разные результаты в разных браузерах:
header("Set-cookie:name=value;expires=expiration");
Используя функцию header ().., необходимо понимать следующее: она должна быть вызвана до того, как что-либо было отправлено в Web-браузер, так же как и в случае с функцией setcookie ().
Чтобы показать переадресацию, создадим простой сценарий, который бу-
дет направлять пользователя при аутентификации на одну страницу, если были
введены правильные имя и пароль, и на другую - в противном случае.
Использование функции header
1. Создайте новый PHP-документ в текстовом редакторе:
<?php
2. Присвойте странице название и включите файл заголовка.
$PageTitle-= "Login Page";
require ("header.php");
3. Создайте условную инструкцию, которая напечатает сообщение, если при аутентификации пользователь допустил ошибки.
if ($Message == "Invalid") {
print ("<BxCENTERxFONT COLOR=RED>The username and password
—you entered do not match what is on file. Please try again!</FONT>
-</CENTERx/B>\n") ;
Если переданные имя и пароль не соответствуют хранящимся в файле, пользователь будет отправлен обратно к этой странице со значением переменной $Message, равным Invalid. Появится сообщение об ошибке.
4. Создайте HTML-форму для ввода имени пользователя и пароля.
print ("<FORM ACTION=\"HandleLogin.php\" METHOD=POST>\n");
print ("Username: <INPUT TYPE=TEXT NAME=UserNamexBR>\n");
print ("Password: <INPUT TYPE=PASSWORD NAME=PasswordxBR>\n");
print ("<INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"Submit!\">\n");
5. Включите файл нижнего колонтитула и закройте РНР-страницу.
require ("footer.php");
6. Сохраните сценарий как login.php (листинг 13.6) и загрузите его на сервер.
Листинг 13.6 т Печатать сообщения об ошибке вполне разумно, так как вы наверняка захотите дать пользователю еще одну попытку, если подлинность его имени и пароля не установлена.
1 <?php ' - -
2 $PageTitle = "Login Page";
3 require ("header.php");
4 if ($Message == "Invalid") {
5 print ("<BxCENTERxFONT COLOR=RED>The username and password you entered do not match what is on file. Please try again!</FONT>
</CENTERx/B>\n");
6 }
7 print ("<FORM ACTION=\"HandleLogin.php\" METHOD=POST>Vn");
8 print ("Username: <INPUT TYPE=TEXT NAME=UserNamexBR>\n");
10 print ("<INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"Submit!\">\n");
11 require ("footer.php");
12 ?>
Теперь необходимо создать страницу, где будут проверяться введенные имя
и пароль пользователя.
7. Создайте новый PHP-документ в текстовом редакторе:
<?php
8. Создайте условную конструкцию, которая будет проверять соответствие
значений переменных $UserName и $Password.
if (($UserName == "Larry") && ($Paseword == "LarryPass")) {
Эта условная инструкция проверяет, соответствуют ли имя пользователя
и пароль хранящимся в файле. Вы можете написать сценарий, котррый будет
находить в базе, пароль по имени пользователя. Обычно в целях безопасности
эти значения явно не прописываются в сценарии, а извлекаются из базы дан-
ных или текстового файла. Однако в нашем примере мы проверяем эти значе-
ния прямо в сценарии.
9. Если введенные данные правильны, направим пользователя на главную страницу.
header ("Location: index.php?UserName=$UserName");
exit;
Это выражение переправит пользователя на ресурс index.php. Туда также будет отправлено значение имени пользователя.
Инструкция exit; «говорит» РНР прекратить выполнение кода этой страницы, так как пользователь уже отправлен на другую.
10. Закончим условную конструкцию и направим пользователя обратно на страницу .аутентификации в случае неверного пароля.
} else {
header ("Location: login.php?Message=Invalid");
exit;
}
Если переданные значения не соответствуют хранящимся в файле, пользователю будет предоставлена еще одна возможность зарегистрироваться. Он
будет отправлен на страницу login.php. Код ?Message=Invalid, добавленный к URL, заставит сценарий login.php напечатать сообщение об ошибке (см. также листинг 13.6).
11. Закройте РНР-страницу.
?>
12. Сохраните сценарий как HandleLogin.php (листинг 13.7) и загрузите его на сервер.
Листинг 13.7 Этот сценарий будет проверять подлинность имени пользователя и пароля с помощью заранее определенных значений и перенаправлять пользователя соответствующим образом. Вне тэга РНР в этом сценарии не должно быть лишних пробелов, иначе функция header () выдаст ошибку.
1 <?php
2 if (($UserName == "Larry") && ($Password == "LarryPaes")) {
3 header ("Location: index.php?UserName=$UserName");
4 exit;
5 } else {
6 header ("Location: login.php?Message=Invalid");
7 exit;
8 }
9 ?>
Модифицируем исходную страницу index.php, чтобы на экране появлялось приветственное сообщение,
13. Откройте файл index.php в текстовом редакторе (листинг 13.3).
14. Замените строку 4 на следующую:
print ("Greetings,$UserName!\n");
15. Сохраните сценарий как index.php (листинг 13.8), загрузите его на сервер и протестируйте все страницы начиная с login.php в Web-браузере (рис. 13.8-13.10).
Листинг 13.8 Мы добавили персонифицированное приветствие, что сделало страницу более динамичной. Значение переменной $UserName передается из функции header () (листинг 13.7).
1 <?php
2 $PageTitle = "Home Page";
3 require ("header.php");
4 print ("Greetings, $OserName!\n");
5 print <"<P>Click <A HREF=\"page2.php\">here</A> to go to the next
page.\n");
6 -require ("footer.php");
7 ?>
Отправка электронной почты с помощью РНР
1. Создайте новый PHP-документ в текстовом редакторе.
<?php
2. Присвойте странице имя и включите файл заголовка.
$PageTitle = "Sending Emails";
require ("header.php");
3. Создайте условную конструкцию для обработки переданной формы.
if ($BeenSubmitted) {
4. Если был передан адрес электронной почты получателя, отправьте сооб-
щение.
if ($MailTo) {
if (mail($MailTo, $Subject, $Body, "From: $MailFrom")) {
print ("<BxCENTERxFONT COLOR=BLUE>Your email has been
-successfully sent!</FONTx/CENTERx/B>\n") ;
} else {
print ("<BxCENTERxFONT COLOR=RED>Your email was not
—successfully sent due to a system error!</FONTx/CENTER>
Мы поместили функцию mail ( ) в условную конструкцию, чтобы пользова-
тель получил сообщение, если почта успешно отправлена.
5. Закончите условные конструкции.
} else {
print ("<BxCENTERxFONT COLOR=RED>Please enter the recipient's
-mail to address ! </FONTx/CENTERx/B>\n" );
6. Закройте PHP-раздел и создайте HTML-форму, в которую вводятся два
адреса электронной почты, тема, само письмо и скрытое значение для
определения того, была ли форма передана.
?>
<FORM ACTION="email.php" METHOD=POST> Recipient's Email Address:
-<INPUT TYPE=TEXT NAME='"MailTo" SIZE="50"xBR> , '
Your Email Address: <INPUT TYPE=TEXT NAME="MailFrom" SIZE="50"xBR>
Email Subject: <INPUT TYPE=TEXT NAME=" Subject" SIZE="80"xBR>
Email Body : <TEXTAREA NAME="Body" ROWS="10" COLS="50">
</TEXTAREAxP>
<INPUT TYPE=HIDDEN NAME=BeenSubmitted VALUE=TRUE>
<INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE*" Submit !">
7. Закройте форму и включите файл нижнего колонтитула.
</FORM>
<?php
require ( "footer .php") ;
?>
8. Сохраните сценарий как email.php (листинг 13.9), загрузите его на сервер
и протестируйте в браузере (рис. 13.11-13.14).
Листинг 13.9 В РНР для отправки электронной почты предназначена
только одна функция - mail (). Мы поместили вызов функции mail О Внутри
различных условных конструкций, чтобы почта отправлялась только после ука-
зания адреса получателя. .
1 <?php
2 SPageTitle = "Sending Emails";
3 require ("header.php");
4 if (SBeenSubmitted) {
5 if ($MailTo) {
6 if (mail($MailTo, $Subject, $Body, "From: $MailFrom")) {
7 print ("<BxCENTERxFONT COLOR=BLUE>Your email has
been successfully sent!</FONTx/CENTERx/B>\n");
8 } else {
9 print ("<BxCENTERxFONT COLOR=RED>Your email was not
successfully sent due to a system error!</FONTx/CENTER>
10 }
11 } else {
12 print ("<BxCENTERxFONT COLOR=RED>Please enter the recipient's
mail to address ! </FONTx/CENTERx/B>\n" );
13 }
14 }
15 ?>
16 <FORM ACTION="email.php" METHOD=POST>
17 Recipient's Email .Address: <INPUT TYPE=TEXT NAME="MailTo"
SIZE="50"xBR>
18 Your Email Address: <INPUT TYPE=TEXT NAME="MailFrom" SIZE="50"xBR>
19 Email Subject: <INPUT TYPE=TEXT NAME=" Subject" SIZE="80"xBR>
20 Email Body : <TEXTAREA NAME="Body" ROWS="10" COLS="50">
21 </TEXTAREAxP>
22 <INPUT TYPE=HIDDEN NAME=BeenSubmitted VALUE=TRUE>
23 < INPUT TYPE=SUBMIT NAME=" SUBMIT" VALUE=" Submit ! ">
24 </FORM>
25 <?php
26 require ( "footer .php" );
27 ?>
Лекция 14. Отладка сценариев.
Распространенные ошибки
Самый распространенный тип ошибок- синтаксические, когда вы забываете, так сказать, расставить все точки над «i». В результате на экране монитора соявляются сообщения, подобные тем, что представлены на рис. 14.1. Первым делом в РНР выявляются ошибки именно этого типа, так как перед выполнением кода обязательно проверяется его синтаксис. Чтобы избежать при программировании подобного рода ошибок, необходимо соблюдать следующие правила:
>• заканчивать каждую исполняемую строку кода точкой с запятой;
>- закрывать кавычки, а также круглые, квадратные и фигурные скобки;
>• экранировать с помощью обратного слеша все одинарные и двойные кавычки внутри функции print ().
Очень часто РНР и текстовый редактор по-разному интерпретируют строки. Так, в сообщении может содержаться информация о том, что обнаружена ошибка, например в строке 12, а это не соответствует действительности. Воспринимайте указываемое РНР место ошибки как отправную точку ее поиска.
Ошибки возникают также, если вы пытаетесь выполнить некоторое невозможное действие. Эти ошибки появляются, например, тогда, когда функции setcookie () или header () вызываются после того, как код HTML уже был отправлен в браузер, когда функция вызывается без соответствующих аргументов или когда вы пытаетесь записать данные в файл, не имея на это полномочий.
Достаточно распространены и логические ошибки - те, что допускает сам программист. Одна из причин подобных проблем - использование некорректного имени переменной. Если это происходит, вы получите не сообщение об ошибке , а странные или непредсказуемые результаты. Устранять логические ошибки труднее всего. Только тщательная проверка и четкий анализ ситуации помогут в таких случаях.
Предотвращение распространенных ошибок
1. Откройте файл HandleLogin.php в текстовом редакторе (листинг 14.1).
Листинг 14.1 Исходная страница HandleLogin.php выглядит неплохо, но она будет еще лучше, если использовать функцию headers_sent ( ) .
1 <?php
2 if (($UserName == "Larry") && ($Password == "LarryPass")) {
3 header ("Location: index. php?UserName=$UserName" );
4 exit;
5 } else {
6 header ("Location: login. php?Message=Invalid" );
7 exit;
8 }
9 ?>
2. Создайте пустую строку до открывающего PHP-тэга. Она сгенерирует сообщение об ошибке.
3. После открывающего PHP-тэга добавьте условную конструкцию.
if ( headers_sent ( ) ) {
print ("Cannot process your request due to a system error !\n");
} else {
Функция headers_sent ( ) возвращает истинное значение, если какой-либо фрагмент кода HTML или пустая строка уже были отправлены в браузер. Если бы это произошло, попытка использовать функцию header ( ) инициировала бы отправку в браузер предупреждения пользователю. Вместо этого, если заголовок будет послан, на данной странице будет представлена типовая системная ошибка.
Если заголовок не отправлялся, функция headers_sent ( ) возвратит ложное значение, и оставшийся код страницы будет выполнен.
4. Не забудьте закрыть условную конструкцию до закрывающего РНР-тэга!
5. Сохраните сценарий как HandleLogin.php (листинг 14.2), загрузите его на
сервер в один каталог с login. php и протестируйте обе страницы в браузере.
Листинг 14.2 т Функция headers_sent ( ) помогает избежать распространенной ошибки отправки заголовка или cookie-файла после того, как на браузер уже пришла информация.
1 - - '
2 <?php
3 if ( headers_sent ( ) ) {
4 print ("Cannot process your request due to a system error! \n") ;
5 } else {
6 if (($UserName == "Larry") && ($Password == "LarryPass")) {
7 header ("Location: index. php?UserName=$UserName" );
8 exit;
9 . } else {
10 header ("Location: login.php?Mess'age=Invalid");
11 exit;
12 }
13 }
14 ?>
Лекция 15. Основные понятия ООП
Классы и объекты
Начнем с основных понятий объектно-ориентированного программирования – класса и объекта. Существует множество определений этих понятий. Мы дадим следующее: объект – это структурированная переменная, содержащая всю информацию о некотором физическом предмете или реализуемом в программе понятии, класс – это описание таких объектов и действий, которые можно с ними выполнять.
В PHP класс определяется с помощью следующего синтаксиса:
class Имя_класса{
var $имя_свойства;
/*список свойств*/
function имя_метода( ){
/* определение метода */
}
/*список методов*/
}
Имена свойств объектов класса объявляются с помощью ключевого слова var, методы, применимые к объектами данного класса, описываются функциями. Внутри определения класса можно использовать ключевое слово this для обращения к текущему представителю класса.
Например, нам нужно создать класс, описывающий категорию статей. У каждой статьи имеются такие свойства, как название, автор и краткое содержание. Какие действия мы хотим совершать со статьями? Возможно, нам понадобится задавать значения перечисленным свойствами статьи, отображать статью в браузере. Тогда определение этого класса может выглядеть следующим образом:
<?
class Articles { // Создаем класс Статей
var $title;
var $author;
var $description;
// метод, который присваивает значения
// атрибутам класса
function make_article($t, $a, $d){
$this->title = $t;
$this->author = $a;
$this->description = $d;
}
//метод для отображения экземпляров класса
function show_article(){
$art = $this->title . "<br>" .
$this->description .
"<br>Автор: " . $this->author;
echo $art;
}
}
Итак, для описания физических объектов типа «статья» мы создали класс с именем Articles, состоящий из трех переменных, содержащих характеристики статьи, и двух функций для создания конкретной статьи и для ее отображения.
Как известно, работая с PHP, можно периодически переключаться в режим HTML. В этом случае программа состоит из нескольких кусков (блоков) кода. Определение класса нельзя разносить по разным блокам php-кода и тем более по разным файлам. То есть если написать:
<?php
class Articles { // Начало описания класса
var $title;
?>
<?php
// продолжение описания класса
function show_article(){
// содержание метода
}
} // конец описания класса
?>
то программа не будет работать корректно.
Несколько замечаний по поводу имен классов. Имя класса должно удовлетворять правилам именования объектов в языке PHP, но есть ряд имен, которые зарезервированы разработчиками для своих целей. В первую очередь это имена, начинающиеся с символа подчеркивания «_». Для создания классов и функций нельзя использовать такие имена. Кроме того, зарезервировано имя stdClass, поскольку оно используется внутри движка PHP.
Инициализация переменных
Часто некоторым атрибутам класса бывает необходимо присваивать значения сразу после создания представителя класса. Когда мы создавали класс статей, для присваивания значений атрибутам (свойствам) класса мы использовали специальную функцию make_article(). Вообще говоря, мы поступили не совсем верно, потому что занялись изобретением велосипеда. Специально для задания начальных значений атрибутам класса существует два стандартных метода. В PHP4 можно инициализировать значения с помощью оператора var или с помощью функции конструктора. С помощью var можно инициализировать только константные значения. Для задания не константных значений используют функцию конструктор, которая вызывается автоматически, когда объект конструируется из класса. Функция-конструктор должна иметь имя, совпадающее с именем всего класса, в котором она определена.
Приведем пример. Допустим, при создании объекта «статья» мы хотим установить его свойства следующим образом: автора – равным строке «Иванов», название и краткое содержание – соответствующим элементам глобального массива $_POST, а дату публикации статьи – текущей дате. Тогда следующее описание класса не является корректным в PHP4:
<?
class Articles { // Создаем класс Статей
var $title= $_POST["title"];
var $author = "Иванов";
var $description = $_POST["description"];
var $published = date("Y-m-d");
// метод, который присваивает значения
// атрибутам класса
}
?>
А вот такое описание класса в PHP4 будет работать так, как нужно:
<?
class Articles { // Создаем класс Статей
var $title;
var $author = "Иванов";
var $description;
var $published;
// метод, который присваивает значения
// атрибутам класса
function Articles(){
$this->title = $_POST["title"];
$this->description = $_POST["description"];
$this ->published = date("Y-m-d");
}
}
?>
Отметим, что в PHP3 и PHP4 конструкторы работают по-разному. В PHP3 функция становилась конструктором, если она имела то же имя, что и класс, а в PHP4 – если она имеет то же имя, что и класс, в котором она определена. Разница в подходах видна, когда один класс расширяет другой и происходит наследование свойств и методов базового класса. Но об этом мы поговорим чуть позже. В PHP5 конструктор класса именуется _construct. Кроме того, в PHP5 появились и деструкторы – функции, которые вызываются автоматически перед уничтожением объекта. В PHP5 функция-деструктор должна быть названа _destruct.
Объекты
В одной из первых лекций мы упоминали о существовании в PHP такого типа данных, как объект. Класс – это описание данных одного типа, данных типа объект. классы являются как бы шаблонами для реальных переменных. Переменная нужного типа создается из класса с помощью оператора new. Создав объект, мы можем применять к нему все методы и получать все свойства, определенные в описании класса. Для этого используют такой синтаксис: $имя_объекта->название_свойства или $имя_объекта->название_метода(список аргументов). Заметим, что перед названием свойства или метода знака $ не ставят.
Пример 15.1. Доступ к методам и свойствам объекта
<?php
$art = new Articles;
// создаем объект $art
echo ($art ->title);
// выводим название объекта $art
$another_art = new Articles;
// создаем объект $another_art
$another_art->show_atricle();
// вызываем метод для
// отображения объекта в браузер
?>
Каждый из объектов класса имеет одни и те же свойства и методы. Так, у объекта $art и у объекта $another_art есть свойства title, description, author и методы Articles(), show_article(). Но это два разных объекта. Представим себе объект как директорию в файловой системе, а его характеристики – как файлы в этой директории. Очевидно, что в каждой директории могут лежать одинаковые файлы, но тем не менее они считаются различными, поскольку хранятся в разных директориях. Точно так же свойства и методы считаются различными, если они применяются к разным объектам. Чтобы получить нужный файл из директории верхнего уровня, мы пишем полный путь к этому файлу. При работе с классами нужно указывать полное имя функции, которую мы хотим вызвать. Директорией верхнего уровня в PHP будет пространство глобальных переменных, а путь указывается с помощью разделителя ->. Таким образом, имена $art->title и $another_art->title обозначают две разные переменные. Переменная в PHP имеет только один знак доллара перед именем, поэтому нельзя писать $art->$title. Эта конструкция будет рассмотрена не как обращение к свойству title объекта $art, а как обращение к свойству, имя которого задано переменной $title (например, $art->"").
Пример 15.2. Установка значений свойств (html, txt)
<?php
$art->title = "Введение в Internet";
// так можно установить
// значение свойства объекта
$art->$title = "Введение в Internet";
// так нельзя установить
// значение свойства объекта
$property = "title";
$art->$property = "Введение в Internet";
// так можно установить значение
// свойства объекта
?<
Создавая класс, мы не можем знать, какое имя будет иметь объект этого класса, тем более что объектов может быть много и все могут иметь разные имена. Соответственно мы не знаем, как обращаться к объекту внутри определения класса. Для того чтобы иметь доступ к функциям и переменным внутри определения класса, нужно использовать псевдопеременную $this. Например, $this->title возвращает значение свойства title у текущего объекта данного класса. Иногда эту переменную предлагают читать как «мое собственное» (к примеру, по отношению к свойству).
Наследование
extends
Механизм наследования – очень важная часть всего объектно-ориентированного подхода. Попытаемся объяснить его суть на примере. Допустим, мы создаем описание человека. Очевидно, что сделать это мы может по-разному в зависимости от того, для чего нужно это описание. Можно описать человека как программиста: он знает такие-то языки программирования, операционные системы, участвовал в стольких-то проектах. Однако если человек программист, то он не перестает быть человеком вообще, т.е. он имеет имя, фамилию, место жительства и т.п. Если перевести наши рассуждения в термины объектно-ориентированного программирования, то можно сказать, что мы описали два класса – класс людей и класс программистов, каждый со своими свойствами и методами. Причем класс программистов, очевидно, обладает всеми свойствами класса людей и при этом имеет свои специфические характеристики, т.е. класс программистов является подклассом класса людей. Так, если у человека вообще есть имя, то у программиста оно тоже должно быть, но не наоборот. Кроме программистов можно выделить еще множество классов по профессиональной принадлежности людей. И все они будут подклассами класса людей. Часто на практике удобно определять общий класс, который может использоваться сразу в нескольких проектах (например, класс людей или личностей), и адаптировать его для специфических нужд каждого проекта (например, как класс программистов). Как это можно реализовать? С помощью механизма расширений. Любой класс может быть расширением другого класса. Расширяющий (или производный) класс, кроме тех свойств и методов, которые описаны в его определении, имеет все функции и свойства основного (базового класса). В нашем примере класс программистов – расширяющий, а класс всех людей – базовый. Из класса нельзя удалить никакие существующие свойства и функции, класс можно только расширить. Расширяющий класс в PHP4 всегда зависит только от одного базового класса, поскольку множественное наследование в PHP не поддерживается. Расширяются классы в PHP с помощью ключевого слова extends.
Пример 5.3. Использование механизма наследования
<?php
class Person { // определяем класс Личности
var $first_name; // имя личности
var $last_name; // фамилия личности
function make_person($t,$a){
// метод устанавливает
// значения имени и фамилии объекта
$this->first_name = $t;
$this->last_name = $a;
}
function show_person(){
// метод отображает информацию о личности
echo ("<h2>" . $this->first_name . " " .
$this->last_name . "</h2>");
}
}
class Programmer extends Person{
// определяем класс
// Programmer, расширяющий Person
var $langs = array ("Lisp");
// константным массивом
// задать переменную в var можно
function set_lang($new_lang){
// метод добавляет еще
// один язык к списку известных
$this->langs[] = $new_lang;
}
}
?>
Класс Programmer имеет те же переменные и функции, что и класс Person, плюс переменную $langs, в которой содержится список изученных программистом языков, и функцию set_lang для добавления еще одного языка к списку изученных. Создать представителя класса программистов можно обычным способом с помощью конструкции new. После этого можно устанавливать и получать список языков, которые знает программист, и в то же время можно использовать функции, заданные для класса Person, т.е. устанавливать и получать имя и фамилию программиста и отображать сведения о нем в браузере:
<?php
$progr = new Programmer;
$progr -< set_lang("PHP");
// методы, определенные для
// класса Programmer
print_r ($progr->langs);
// методы, определенные для класса Person
$progr->make_person("Bill","Geits");
$progr->show_person();
?<
Отношения, в которых состоят созданные нами классы Person и Programmer, называют также отношениями родитель–потомок. Класс Person – родитель, а его потомки, такие как класс Programmer, создаются, основываясь на нем, с помощью расширений. Любой класс может стать родительским и соответственно породить потомков.
Порядок определения классов имеет значение. Нельзя сначала определить класс Programmer, расширяющий класс Person, а уже потом сам класс Person. Класс должен быть определен перед тем, как он будет использоваться (расширяться).
Конструкторы
Теперь, после знакомства с механизмом наследования в PHP, мы можем прокомментировать различие между конструкторами PHP4 и PHP3 и более подробно рассказать о конструкторах вообще. Напомним, что в PHP3 конструктор – это функция, имя которой совпадает с именем класса. А в PHP4 – функция, имя которой совпадает с именем класса, в котором она определена.
Пример 15.4. Использование конструктора
<?php
class Programmer extends Person{
// определяем класс
// Programmer, расширяющий Person
var $langs = array ("Lisp");
function Programmer(){
// этот конструктор будет
// работать и в PHP3, и в PHP4
$this->make_person("Иван","Петров");
}
}
?>
Здесь функция Programmer() является конструктором, т.е. выполняется сразу после создания любого представителя класса Programmer, задавая ему имя «Иван» и фамилию «Петров». конструкторы, как и любые другие функции, могут иметь аргументы. В этом случае, создавая представителя класса, нужно указать значения этих параметров. Аргументы конструктора могут иметь и значения по умолчанию. Если все аргументы имеют значения по умолчанию, тогда можно создавать экземпляр класса без параметров.
Пример 15.5. Использование конструктора
<?php
class Programmer extends Person{
// определяем класс
// Programmer, расширяющий Person
var $langs = array ("Lisp");
function Programmer($n = "Иван",
$f = "Петров"){
// это конструктор
$this->make_person($n,$f);
}
}
$default_progr = new Programmer();
// создаст программиста Ивана Петрова
$new_progr = new Programmer("Вася",
"Сидоров");
// создаст программиста Васю Сидорова
print_r($new_progr);
/* выведет информацию о переменной
$new_progr, т.е. свойства объекта
и их значения */
?>
Приведенные примеры будут работать и в PHP3, и в PHP4, конечно если дописать в них определение базового класса Person. Допустим, ситуация немного другая: конструктор имеется только у базового класса Person:
<?php
class Person { // определяем класс Личности
var $first_name;
var $last_name;
function Person($t,$a){ // конструктор
$this->first_name = $t;
$this->last_name = $a;
}
/* ... */
}
class Programmer extends Person{
// определяем класс
// Programmer, расширяющий Person
var $langs = array ("Lisp");
function set_lang($new_lang){
$this->langs[] = $new_lang;
}
}
$new_progr = new Programmer("Вася",
"Сидоров");
?>
Что произойдет в этом случае при создании объекта класса Programmer, будет ли автоматически вызвана какая-либо функция? В PHP3 ничего не произойдет, поскольку в этом классе нет функции с именем Programmer() (здесь конструктор – это функция, имя которой совпадает с именем класса). В PHP4 будет вызван конструктор базового класса, если он существует, т.е. вызовется функция Person() из класса Person (здесь конструктор – функция, имя которой совпадает с именем класса, в котором она определена).
Еще одна ситуация – в базовом классе есть функция, имя которой совпадает с именем расширяющего класса, а в расширяющем классе нет конструктора.
<?php
class Person { // определяем класс Личности
var $first_name;
var $last_name;
function Person($t,$a){ // конструктор
$this->first_name = $t;
$this->last_name = $a;
}
function Programmer($new_lang){
echo "Я – программист";
}
}
class Programmer extends Person{
// определяем класс
// Programmer, расширяющий Person
var $langs = array ("Lisp");
function set_lang($new_lang){
$this->langs[] = $new_lang;
}
}
$new_progr = new Programmer("Вася",
"Сидоров");
?<
В этом случае PHP3 вызовет в качестве конструктора функцию Programmer() из описания класса Person. Поскольку конструктор – это функция, у которой то же имя, что и у класса. И неважно, определена ли эта функция в самом классе или она наследуется из базового класса. В PHP4 класс Programmer не будет иметь своего конструктора, поэтому вызовется конструктор базового класса.
Ни в PHP 3, ни в PHP 4 конструктор базового класса не вызывается автоматически из конструктора порожденного класса.
Оператор ::
Иногда внутри описания класса возникает необходимость сослаться на функции или переменные из базового класса. Бывает, что нужно ссылаться на функции в классе, ни один представитель которого еще не создан. Как быть в таком случае? В PHP4 для этого существует специальный оператор «::»
Например, вот так можно вызвать в описании класса Programmer функцию show_name() из базового класса Person и функцию say_hello(), заданную в описании класса Programmer, когда ни один объект этого класса еще не был создан:
<?php
class Person { // определяем класс Личности
var $first_name;
var $last_name;
function Person($t,$a){ // конструктор
$this->first_name = $t;
$this->last_name = $a;
}
function show_name(){
// метод отображает информацию о личности
echo ("Меня зовут, " .
$this->first_name . " " .
$this->last_name . "!<br>");
}
}
class Programmer extends Person{
// определяем класс
// Programmer, расширяющий Person
function set_lang($new_lang){
// метод добавляет еще
// один язык к списку известных
$this->langs[] = $new_lang;
Person::show_name();
// вызываем функцию из базового класса
echo "И я знаю теперь еще и " .
$new_lang;
}
function show_name(){
echo ("Я программист, " .
$this->first_name . " " .
$this->last_name . "!<br>");
}
function say_hello(){
echo "Привет!<br>";
}
}
Programmer::say_hello();
// вызываем функцию, когда ни
// один объект ее класса еще не создан
$new_progr = new Programmer("Вася","Сидоров");
$new_progr->set_lang("PHP");
?>
В результате работы этой программы получим следующее:
Привет!
Меня зовут Вася Сидоров!
И я знаю теперь еще и PHP
С помощью команды Programmer::say_hello(); мы вызываем функцию say_hello класса Programmer как таковую, а не как метод, применяемый к объекту данного класса. В этот момент переменных класса нет. Поэтому функции, вызываемые до создания объекта, не могут пользоваться переменными класса и конструкцией this, но могут пользоваться локальными и глобальными переменными.
В определении класса Programmer мы переопределили функцию show_name(), поэтому вызвать функцию show_name() из базового класса Person можно только с помощью оператора «::» Вообще говоря, внутри определения класса мы можем вызывать любые методы и свойства, заданные в его базовом классе с помощью обычного $this, если только порожденный класс не переопределяет эти свойства и методы, как в нашем примере.
Оператор parent
В приведенном выше примере, обращаясь в базовому классу, мы использовали его имя (мы писали Person::show_name()). Это не совсем удобно, потому что имя класса или иерархия классов может измениться, и тогда придется переписывать код описаний всех классов с тем, чтобы привести используемые в них имена в соответствие с новой иерархией. Чтобы избежать подобной ситуации, вместо имени базового класса нужно использовать ключевое слово parent (например, parent::show_name()). Parent ссылается на класс, прописанный после extends в объявлении вашего класса. Поэтому если вдруг иерархия классов изменится, то достаточно будет внести изменения в имена, указанные после extends в описаниях классов.
Объектная модель PHP5
Кроме нового названия для конструкторов и появления деструкторов в PHP5 произошло еще достаточно много изменений. Мы не будем обсуждать их подробно, только опишем в общих чертах. Основное изменение – это передача значений параметров класса по ссылке и присвоение объектов по ссылке, а не по значению, как это было в PHP4. В PHP5 если создаются две равные переменные типа объект, то они указывают на одно значение и изменяются одновременно (мы приводили похожий пример с переменными строкового типа). В связи с этим появился новый механизм для создания копий объектов – так называемое клонирование. В PHP4 все методы и переменные класса доступны извне, т.е. они всегда являются открытыми. В PHP5 переменные и методы можно делать открытыми (доступными отовсюду), закрытыми (доступными только внутри класса) и защищенными (доступными внутри класса и в его производных классах). Кроме того, появилась возможность создавать интерфейсы и абстрактные классы и многое другое. В целом объектная модель в PHP5 значительно усовершенствована для более точного соответствия объектно-ориентированной парадигме программирования.
Решение задачи
Итак, мы хотели по выбору пользователя генерировать форму для ввода описания статьи или человека и отображать данные, введенные в эту форму. Попробуем решить эту задачу, используя объектно-ориентированный подход. Для начала создадим форму, где пользователь выбирает, что он хочет создать, – описание статьи или человека (точнее, это будут две формы):
<form action="task1.php">
Создать описание статьи: <input type=submit
name=art_create
value="Create Article">
</form>
<form action="task1.php">
Создать описание личности: <input
type=submit name=pers_create
value="Create Person">
</form>
Теперь напишем файл для обработки этих форм. В нем создадим два класса – статьи и личности. У каждого класса имеется метод для инициализации его переменных и метод для отображения объектов данного класса. При решении задачи будут использованы две функции, встроенные в PHP для работы с классами и объектами. Это функция get_class(объект), возвращающая имя класса, экземпляром которого является объект, переданный ей в качестве параметра. И функция get_class_vars(имя класса), которая возвращает массив всех свойств класса и их значений по умолчанию. Аналогично можно получить массив имен всех методов класса: get_class_methods (имя класса)
Листинг 15.6. Использование объектно-ориентированного подхода
<?php
// Создаем классы Статей и Личностей.
// Статья имеет заголовок, автора и
// описание. Личность имеет имя, фамилию
// и e-mail
class Article {
var $title;
var $author;
var $description;
// метод, который присваивает значения
// атрибутам класса
function Article($t="Название отсутствует",
$a="Автор отсутствует",
$d="Описание отсутствует"){
$this->title = $t;
$this->author = $a;
$this->description = $d;
}
//метод для отображения экземпляров класса
function show(){
$art = "<h2>$this->title</h2><font
size=-1>$this->description</font><p>Автор:
$this->author</p>";
echo $art;
}
}
// Определение класса Личностей
class Person {
var $first_name;
var $last_name;
var $email;
//метод, который присваивает значения атрибутам класса
function Person($t="Имя не введено",
$a="Фамилия не введена",$d="Email не указан"){
$this-<first_name = $t;
$this-<last_name = $a;
$this-<email = $d;
}
//метод для отображения экземпляров класса
function show(){
$art = "<h2>$this->first_name</h2><font
size=-1>$this->last_name</font><p>Автор:
$this->email</p>";
echo $art;
}
}
// Далее следует собственно создание и отображение
// экземпляров выбранного класса
if (isset($_GET["art_create"])){ //Если была выбрана статья
$art = new Article; // создаем представителя класса статей
$art_vars = get_class_vars(get_class($art)); //какие
// аргументы этого класса нужно задать
Make_form($art,$art_vars,"art_create"); //вызов функции
// создания формы
if (isset($_GET["create_real"])){ Show_($art_vars); }
// если данные этой формы отправлены, то вызываем
// функцию показа
}
//то же самое, если была выбрана личность
if (isset($_GET["pers_create"])){
$art = new Person;
$art_vars = get_class_vars(get_class($art));
Make_form($art,$art_vars,"pers_create");
if (isset($_GET["create_real"])){ Show_($art_vars); }
}
// функция создания формы
function Make_form($art,$art_vars,$glob){
$str = "<form>"; // html код формы записывается
// в строку $str
//перебираем список переменных класса объекта $art
foreach ($art_vars as $var_name => $var_value){
$str .="$var_name<input type=text name=$var_name><br>";
//создаем элемент формы с именем свойства класса
}
$str .= "<input type=hidden name=$glob>"; // чтобы не
// забыть, что мы создаем
$str .= "<input type=submit name=create_real
value='Create and Show'></form>";
echo "$str"; // выводим форму
}
// функция показа объекта
function Show_($art_vars){
global $art; //используется глобальное имя объекта
$k = count($art_vars); //число свойств класса
// (переменных в форме)
$p=0; //вспомогательная переменная
foreach ($art_vars as $name => $value){
$p++;
if ($_GET["$name"]=="") $val= $art->$name;
else $val = $_GET["$name"];
if ($p<>$k) $par .='"'. $val.'",';
else $par .='"'. $val.'"';
}
$par = '$art->'.$const ."(" .$par.");";
// теперь $par представляет собой php-код для вызова
// метода класса $art, изначально
// записанного в $par
// например,
// $art->Person('Vasia','Petrov','vas@intuit.ru');
eval($par); // функция eval выполняет код,
// содержащийся в $par
$art->show();
}
?>
УТВЕРЖДЕНЫ
на заседании кафедры
«Информационные системы»
учреждения «Университет «Туран»
Протокол № __ от «____»________ 2012 г.
Заведующая кафедрой
___________________С.А.Тусупова
