Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

PHP5_nachinayushim

.pdf
Скачиваний:
29
Добавлен:
20.03.2015
Размер:
26.79 Mб
Скачать

Ответы 703

register_user(); $userid = get_userid();

$_SESSION['userid'] = $userid;

}

session_start(); session_register("userid", "useremail"); if (empty($_GET['action'])){

$_GET['action'] = "";

}

switch($_GET['action']) { case "order":

place_order(); break;

case "register": customer_session();

order_menu(); break;

default: login_form();

break;

}

?>

Глава 12

Упражнение 1

В чем разница между классом и объектом?

Решение

Класс подобен чертежу, в котором лишь указаны инструкции для создания объек+ та. Объект представляет собой экземпляр класса. Классы используются во время раз+ работки, в ходе изменения кода в PHP+файле. Объекты используются во время вы+ полнения программы, когда присваиваются или изменяются значения свойств и вызываются методы. Класс представлен текстом в текстовом файле. Объект сущест+ вует в памяти в виде инструкций.

Упражнение 2

Объясните идею наследования и дайте пример того, когда его следует использо+ вать, не повторяя при этом примеров, рассмотренных в данной главе.

Решение

Наследование ++++++ способность объекта приобретать свойства и методы родитель+ ского объекта. Наследование подразумевает связанную иерархию и повторное ис+ пользование кода. Дочерний класс ++++++ более специализированная версия родительско+ го класса, имеющая дополнительные методы и свойства и/или другую реализацию тех же методов и свойств. В дочернем классе не может быть меньше методов или свойств, чем в родительском. Примером наследования может быть связь между по+ звоночными животными и млекопитающими. Все позвоночные животные имеют позво+ ночник, состоящий из множества позвоночных костей, окружающих спинной мозг,

704 Приложение А

и большой головной мозг, заключенный в черепную коробку. Млекопитающие пред+ ставляют собой более специализированный вид позвоночных животных. Хотя мле+ копитающие имеют все свойства позвоночных животных, они также имеют волося+ ной покров или мех, они теплокровны и вскармливают потомство молоком. Класс

Позвоночные может иметь такие свойства, как количествоПозвонков и типСкелета

(значением последнего свойства для акул будет хрящевой, а для млекопитающих и рептилий ++++++ костяной). Млекопитающие наследуют все эти свойства и имеют свои собственные ++++++ цветШерстии нормальнаяТемператураТела.

Упражнение 3

Опишите полезные особенности интерфейса и его практическое применение в программной архитектуре. Чем интерфейс отличается от наследуемого класса? Приведите дополнительные примеры возможного применения интерфейсов.

Решение

Интерфейс представляет собой абстрактную конструкцию, определяющую ‘‘конт+ ракт’’ ++++++ жесткое требование обеспечить в реализующих классах определенные мето+ ды. Хотя наследование классов предполагает наличие непосредственной связи между родительским классом и наследующими его подклассами, интерфейс не означает та+ кой связи, а используется для определения классов, способных на выполнение тех же функций. Так как все классы, реализующие интерфейс, должны по определению иметь, как минимум, набор методов, определенных в интерфейсе (они могут иметь дополнительные методы, но не меньше), интерфейс можно использовать для переда+ чи не связанных иначе объектов одним и тем же функциям. Например, PHP постав+ ляется с двумя интерфейсами ++++++ Iterator и IteratorAggregate, ++++++ которые позво+ ляют передавать объекты в конструкции foreach тогда и только тогда, когда эти объекты реализуют один из этих двух интерфейсов. Эти интерфейсы позволяют об+ рабатывать в foreach+циклах объекты, содержащие в себе другие объекты. Любой класс может реализовывать эти интерфейсы, поэтому можно использовать абсолютно не связанные друг с другом объекты в одних и тех же foreach+конструкциях.

Глава 15

Упражнение

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

Решение

Первый этап создания приложения, которое рассылает e+mail+сообщения по спи+ ску адресов, состоит в формировании списка этих адресов в виде массива. Как прави+ ло, процесс получения данных из базы (такой как MySQL или Postgresql) начинается с выполнения некоторого SQL+оператора SELECT с помощью функции pg_exec() или mysql_query(). Отобранные записи сохраняются в PHP+переменной (которую неред+ ко называют $res, т.е. ‘‘результат’’). Впоследствии количество записей в таком массиве можно определить с помощью функции pg_numrows() или mysql_numrows(), а цикл

Ответы 705

for с помощью функции pg_fetch_array() или mysql_fetch_array() обеспечи+ вает способ получения отдельных строк (записей) из переменной $res.

Таким образом, можно выполнить SELECT+запрос для базы данных, содержащей информацию о клиентах (включая e+mail+адреса), а затем, в случае если в результате имеется несколько записей, использовать for+цикл для выборки каждого e+mail+ адреса и передачи его функции, осуществляющей рассылку писем (код такой функции с некоторой реализацией проверки достоверности адресов показан ниже).

$query = "SELECT email FROM customers;"; $res = pg_exec($conn,$query); if(pg_numrows($res) >= 1) {

for ($i=0; $i<=pg_numrows($res)-1; $i++) { $rec = pg_fetch_array($res,$i);

if ($rec[email] !== "") {

if (strpos($rec[email],"@") >= 0) { $body = "Это тело сообщения"\n\n"; //Заголовок From:

$headers .= "From: Example <info@example.com>\n"; //Отправка почты

$to = "$rec[email]"; $subject = "Example Email";

mail($to, $subject, $body, $headers);

} else {

echo = "Адрес $i неправильный.<br>";

}

}

}

}

Глава 16

Упражнение 1

Создайте PHP+сценарий, который открывает файл изображения и добавляет в изо+ бражение черную рамку толщиной в один пиксель.

Решение

Единственная хитрость, необходимая для успешного выполнения упражнения, за+ ключается в том, что левый верхний угол изображения имеет координаты x = 0 и y = 0. Это означает, что для получения координат самой нижней правой точки из величин ширины и высоты изображения необходимо отнять 1. Ниже приведен сценарий+ решение (exercise1.php) этого упражнения:

<?php

$myImage = imagecreatefromjpeg('cape_point.jpg'); $black = imagecolorallocate($myImage,0,0,0); $width = imagesx($myImage);

$height = imagesy($myImage);

imagerectangle($myImage, 0, 0, $width-1, $height-1, $black); header("Content-type: image/jpeg");

imagejpeg($myImage); imagedestroy($myImage); ?>

Этот сценарий (или подобный ему) должен формировать красивую рамку вокруг изображения, как показано на рис. A.1.

706 Приложение А

Рис. A.1.

Упражнение 2

Используя функции disk_total_space() и disk_free_space(), покажите графическим способом объем используемого пространства на жестком диске.

Решение

Существует два очевидных способа графического отображения результатов этого упражнения. Самый простой и быстрый способ ++++++ создать скользящую шкалу: прямо+ угольник, состоящий из двух цветных блоков, один из которых представляет исполь+ зуемое пространство на диске, а второй ++++++ свободное пространство. Это позволит создать компактную диаграмму использования дискового пространства. Ниже под+ робно разбирается код (файл exercise2a.php) для решения этой задачи.

Хорошей методикой всегда считалось хранение значений ширины и высоты изо+ бражений в сценарии. Изменить впоследствии размер изображения можно будет в начале сценария, в результате чего все вычисления ширины и высоты будут автома+ тически обновлены.

<?php

$iWidth = 500; $iHeight = 50;

Ответы 707

Создайте изображение и добавьте в него белый и черный цвет. Так как белый в данном случае добавляется первым, он будет фоновым цветом изображения. Чер+ ный будет использоваться для создания рамки изображения.

$myImage = imagecreate($iWidth, $iHeight);

$white = imagecolorallocate($myImage,255,255,255); $black = imagecolorallocate($myImage,0,0,0);

В приведенном здесь решении красный цвет представляет занятое пространство на диске, а зеленый ++++++ свободное пространство, хотя можно использовать любые другие цвета.

$red = imagecolorallocate($myImage, 255,0,0); $green = imagecolorallocate($myImage,0,255,0);

Необходимо получить общий объем дискового пространства и объем свободного пространства. Оба значения возвращаются в байтах. Фактические значения несуще+ ственны ++++++ они требуются лишь для вычисления пропорции, которая будет воспроиз+ ведена в изображении.

$diskTotal = disk_total_space('/'); $diskFree = disk_free_space('/');

Затем вокруг изображения необходимо нарисовать черную рамку толщиной в один пиксель.

imagerectangle($myImage, 0, 0, $iWidth - 1, $iHeight - 1, $black);

Переменная $threshold используется для отметки x+координаты той точки диа+ граммы, где происходит переход от занятого пространства к свободному. Так как на подобных диаграммах занятое пространство обычно представлено слева, сначала не+ обходимо вычислить площадь левой (красной) области прямоугольника ++++++ она про+ порциональна общему объему дискового пространства минус объем свободного пространства. Полученное значение следует разделить на общий объем дискового пространства, чтобы получить число в диапазоне от 0 до 1, которое затем нужно ум+ ножить на ширину изображения (перед этим необходимо вычесть 2 из ширины изо+ бражения, поскольку вокруг изображения уже есть рамка). После этого нужно приба+ вить 1, так как отсчет пикселей начинается с 0.

$threshold = intval((($diskTotal - $diskFree) / $diskTotal) * ($iWidth-2)) + 1;

Например, предположим, что объем диска равен 400 байтам, из которых 200 заня+ то, тогда 200/400 = 0,5. Если ширина изображения равна 500 пикселей, то умножаем 498 (ширина минус 2 пикселя для рамки) на 0,5 и получаем 249. Затем прибавляем 1 и по+ лучаем 250 ++++++ позицию перехода одной области изображения в другую.

Чтобы представить занятое пространство, создаем в изображении красный пря+ моугольник, достигающий точки перехода:

imagefilledrectangle($myImage, 1, 1, $threshold, ($iHeight-2), $red);

Затем создаем зеленый прямоугольник, начиная от точки перехода ++++++ для форми+ рования области свободного пространства:

imagefilledrectangle($myImage, ($threshold + 1), 1, ($iWidth - 2), $iHeight-2, $green);

708 Приложение А

Завершаем сценарий как обычно:

header("Content-type: image/png"); imagepng($myImage); imagedestroy($myImage);

?>

Результат выполнения сценария показан на рис. A.2.

Рис. A.2.

Можно выполнить это упражнение иначе ++++++ построить круговую диаграмму ис+ пользования дискового пространства. Файл exercise2b.php содержит код соответ+ ствующего сценария. Рассмотрим его подробнее.

Вместо определения точки перехода вычисляется угол сектора. Методика вычис+ лений остается прежней, кроме того, что относительное значение дискового объема умножается не на ширину изображения, а на 360 ++++++ количество градусов в полном круге.

<?php

$iWidth = 200; $iHeight = 200;

$myImage = imagecreate($iWidth, $iHeight);

$white = imagecolorallocate($myImage,255,255,255); $red = imagecolorallocate($myImage, 255,0,0); $green = imagecolorallocate($myImage,0,255,0); $diskTotal = disk_total_space('/');

$diskFree = disk_free_space('/');

$usedDegrees = intval((($diskTotal - $diskFree) / $diskTotal) * 360);

Функция imagefilledarc() работает так же, как и imagearc(), кроме того, что она принимает дополнительный аргумент, определяющий способ заполнения дуги. Использование в качестве значения этого параметра PHP+константы IMG_ARC_EDGED приводит к тому, что две конечные точки дуги соединяются с центром и полученный контур заполняется заданным цветом. Отсчет начинается с 0 градусов, дуга рисуется до вычисленного угла, $usedDegrees.

imagefilledarc($myImage, ($iWidth/2), ($iHeight/2), $iWidth - 2, $iHeight - 2, 0, $usedDegrees, $red, IMG_ARC_EDGED);

Ответы 709

Чтобы нарисовать дугу, представляющую свободное пространство, начните с того места, где заканчивается область занятого пространства, т.е. с $usedDegree, и про+ должайте рисовать дугу до 360 градусов, до конца круга:

imagefilledarc($myImage, ($iWidth/2), ($iHeight/2), $iWidth - 2, $iHeight - 2, $usedDegrees, 360, $green, IMG_ARC_EDGED);

Завершаем сценарий как обычно:

header("Content-type: image/png"); imagepng($myImage); imagedestroy($myImage);

?>

Результат выполнения сценария показан на рис. A.3.

Рис. A.3.

Á

Справочник по PHP-функциям

Это приложение не может содержать исчерпывающего перечня всех PHP+функ+ций (иначе оно заняло бы сотни страниц) ++++++ здесь представлено подмножество функций (и их описаний), с которыми, по мнению авторов, разработчики PHP+сценариев стал+ киваются в повседневной работе. В перечень включены основные функции языка, а также функции часто используемых PHP+расширений.

Приложение задумывалось как краткий справочник или памятка по входным па+ раметрам и возвращаемым типам данных, а не как полное описание функций и мето+ дики их использования в сценариях. Чтобы узнать, как использовать ту или иную функцию или найти информацию по неописанным здесь функциям, обратитесь к странице PHP+документации www.php.net/docs.php.

Web-сервер Apache

Функция

Тип

Описание

возвращаемых

 

данных

 

apache_child_terminate(void)

apache_note(string note_name [, string note_value])

virtual(string filename)

getallheaders(void)

apache_request_headers(void)

Bool

Завершает apache-процесс после

 

данного запроса

String

Получает и устанавливает

 

замечания apache-запроса

Bool

Выполняет подзапрос apache

Array

Псевдоним для функции

 

apache_request_headers()

Array

Возвращаетвсезаголовкиhttp-запроса

Справочник по PHP*функциям 711

Окончание таблицы

Функция

Тип

Описание

возвращаемых

 

данных

 

apache_response_headers(void)

apache_setenv(string variable, string value [, bool walk_to_top])

apache_lookup_uri(string URI)

apache_get_version(void)

apache_get_modules(void)

Array

Возвращает все заголовки http-

 

ответа

Bool

Устанавливает apache-

 

переменную subprocess_env

Object

Выполняет частичный запрос по

 

заданному URI и возвращает

 

всю информацию о нем

String

Возвращает версию Apache

Array

Возвращает список загруженных

 

модулей apache

Массивы

Функция

Тип

Описание

возвращаемых

 

данных

 

krsort(array array_arg [, int sort_flags])

ksort(array array_arg [, int sort_flags])

count(mixed var [, int mode])

natsort(array array_arg)

natcasesort(array array_arg)

asort(array array_arg [, int sort_flags])

arsort(array array_arg [, int sort_flags])

sort(array array_arg [, int sort_flags])

rsort(array array_arg [, int sort_flags])

usort(array array_arg, string cmp_function)

uasort(array array_arg, string cmp_function)

Bool

Сортирует массив по ключам

 

в обратном порядке

Bool

Сортирует массив по ключам

Int

Считает элементы в переменной

 

(обычно в массиве)

Void

Сортирует массив с использованием

 

алгоритма “естественный порядок”

Void

Сортирует массив с использованием

 

нечувствительного к регистру символов

 

алгоритма “естественный порядок”

Bool

Сортирует массив и сохраняет связь

 

индексов и значений

Bool

Сортирует массив в обратном порядке

 

и сохраняет связь индексов и значений

Bool

Сортирует массив

Bool

Сортирует массив в обратном порядке

Bool

Сортирует массив по значениям

 

с помощью пользовательской

 

функции сравнения

Bool

Сортирует массив по значениям

 

с помощью пользовательской

 

функции сравнения и сохраняет

 

связь индексов и значений

712 Приложение Б

 

 

Продолжение таблицы

 

 

 

Функция

Тип

Описание

возвращаемых

 

данных

 

uksort(array array_arg, string cmp_function)

end(array array_arg)

prev(array array_arg)

next(array array_arg)

reset(array array_arg)

current(array array_arg)

key(array array_arg)

min(mixed arg1 [, mixed arg2 [, mixed. . . ]])

max(mixed arg1 [, mixed arg2 [, mixed. . . ]])

array_walk(array input, string funcname [, mixed userdata])

array_walk_recursive(array input, string funcname [, mixed userdata])

in_array(mixed needle, array haystack [, bool strict])

array_search(mixed needle, array haystack [, bool strict])

extract(array var_array [, int extract_type [, string prefix]])

compact(mixed var_names [, mixed. . . ])

array_fill(int start_key, int num, mixed val)

range(mixed low, mixed high[, int step])

Bool

Сортирует массив с помощью

 

пользовательской функции сравнения

Mixed

Устанавливает внутренний указатель

 

массива на последний элемент и

 

возвращает значение этого элемента

Mixed

Перемещает внутренний указатель

 

массива к предыдущему элементу

 

и возвращает этот элемент

Mixed

Перемещает внутренний указатель

 

массива к следующему элементу

 

и возвращает этот элемент

Mixed

Устанавливает внутренний указатель

 

массива на первый элемент

 

и возвращает этот элемент

Mixed

Возвращает текущий элемент массива

Mixed

Возвращает ключ текущего элемента

 

массива

Mixed

Находит наименьшее значение

 

в массиве или последовательности

 

аргументов

Mixed

Находит наибольшее значение

 

в массиве или последовательности

 

аргументов

Bool

Применяет пользовательскую

 

функцию к каждому члену массива

Bool

Рекурсивно применяет

 

пользовательскую функцию

 

к каждому члену массива

Bool

Проверяет существование заданного

 

значения в массиве

Mixed

Ищет в массиве заданное значение

 

и возвращает соответствующий ключ

 

в случае успеха

Int

Импортирует переменные в таблицу

 

имен из массива

Array

Создает массив, содержащий

 

переменные и их значения

Array

Создаетмассивсnum элементов, начи-

 

ная с индекса start_key и присваивая

 

каждому элементу значение val

Array

Создает массив, содержащий диапазон

 

целых чисел или символов от low до

 

high (включительно)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]