Рабочая тетрадь(4)
.pdf•Проверьте, был ли передан HTTP-методом POST параметр format
•Измените код так, чтобы в переменной $dvd создавался экземпляр класса
DVDStrategy
•Вызовите метод setStrategy() объекта $dvd, передавая ему в качестве параметра либо экземпляр класса DVDAsXML, либо экземпляр класса DVDAsJSON, в зависимости от значения параметра format
•Вызовите метод get() объекта $dvd
•Сохраните файл catalog\actions.class.php
Упражнение 3: Использование шаблона Стратегия
•Запустите браузер
•В адресной строке наберите http://mysite.local/catalog/catalog.php
•В колонке Название кликните по любой ссылке
•Нажмите на кнопку [Распечатать]
•В директории catalog\output должен появиться файл c расширением xml
•Откройте xml-файл и убедитесь, что в файле содержится корректная запись в формате xml
•Переключитесь в браузер и опять кликните по любой ссылке в колонке Название
•Выберите несколько элементов формы checkbox
•Выберите checkbox как JSON и нажмите на кнопку [Распечатать]
•В директории catalog\output должен появиться файл c расширением json
•Откройте json-файл и убедитесь, что в файле содержится корректная запись в формате json
•Убедитесь, что код работает без ошибок
Обзор UML
Диаграмма классов
Введение в шаблоны проектирования
Шаблоны проектирования
Singleton Pattern
Factory Pattern
Strategy Pattern
Игорь Борисов http://igor-borisov.ru
SPL – Standard PHP Library
Общие принципы
Интерфейсы
Итераторы
Классы
Структуры данных
Функции
Наша мантра:
$result = mysql_query("SELECT id, name FROM table"); while ($row = mysql_fetch_array($result)) {}
$dir = opendir("/home/folder/files"); while ($file = readdir($dir)) {}
$f = fopen("/home/folder/files/file.txt", "r"); while (!feof($f)) {}
spl_classes()
Стандартная библиотека PHP — коллекция классов и
интерфейсов для решения стандартных проблем в PHP.
Библиотека была введена в PHP 5 и доступна по умолчанию, начиная с PHP 5.3
Класс Closure
Встроенные интерфейсы
Traversable
Iterator
ArrayAccess
IteratorAggregate
Serializable
Интерфейсы SPL
Countable
OuterIterator
RecursiveIterator
SeekableIterator
Анонимная функция
$greet = function($name){ printf("Hello %s\r\n", $name);
};
$greet('World'); $greet('PHP');
Замыкание
$fn = function() use (&$country) { echo $country . "\n";
};
$country = 'Russia'; $fn();
Итератор — объект, позволяющий перебирать все элементы коллекции без учёта особенностей её реализации
rewind()
false
valid()
Traversable
Iterator extends Traversable
mixed current ( void )
scalar key ( void )
void next ( void )
void rewind ( void )
boolean valid ( void )
true $key = key()
$value = current()
next()
Лабораторная работа 2.1
Использование интерфейса Iterator
Упражнение 1: Создание класса, наследника интерфейса Iterator
•Запустите браузер
•В адресной строке наберите http://mysite.local/news/news.php
•Вы должны увидеть список новостей. Убедитесь, что список выводится корректно, без ошибок
•В текстовом редакторе откройте файл news\FetchIterator.class.php
•Опишите метод __construct() как: $this->fetchCallback = $fetchCallback; $this->count = 0;
•Опишите метод current() как: $this->count || $this->next(); return $this->current;
•Опишите метод key() как: $this->count || $this->next(); return $this->count - 1;
•Опишите метод valid() как: $this->count || $this->next(); return $this->validate();
•Опишите метод validate() как:
return false != $this->current || is_string($this->current);
•Опишите метод next() как:
if ($this->count && ! $this->validate()) { return;
}
$this->fetch(); $this->count++;
•Опишите метод fetch() как:
$func = $this->fetchCallback; $this->current = $func();
•Сохраните файл news\FetchIterator.class.php
Упражнение 2: Изменение логики метода класса
•В текстовом редакторе откройте файл news\NewsDB.class.php
•Найдите метод getNews()
•В методе закомментируйте строку: return $this->db2Arr($result);
•Ниже закомментированной строки допишите:
$fetchFunction = function() use ($result) {
return $result->fetchArray(SQLITE3_ASSOC);
};
return new FetchIterator($fetchFunction);
• Сохраните файл news\NewsDB.class.php
Упражнение 3: Проверка работы скрипта
•Запустите браузер
•В адресной строке наберите http://mysite.local/news/news.php
•Вы не должны увидеть каких-либо изменений по сравнению с первым запуском
•Если есть ошибки, найдите и исправьте их
