Слайд 1Московский технологический институт
Проектирование и разработка интернет-приложений № 7-8
(Объектно-ориентированное программирование на
PHP. PHP и SQLite. PHP и XML)
Кафедра: Информатики и
автоматизации
Автор: к.т.н., доцент Долин Георгий Аркадьевич
Контакты: dolin1974@gmail.com
Москва - 2016
Слайд 2Рекомендуемая литература
«PHP5. Полное руководство»
Джон Коггзолл. Диалектика. 2006 г.
«Разработка
Web-приложений с помощью PHP и MySQL»
Люк Веллинг, Лаура Томсон. Вильямс.
2007 г.
«AJAX и PHP. Разработка динамических веб-приложений»
Кристиан Дари, Богдан Бринзаре, Филип Черчез-Тоза, Михай Бусика. Символ-Плюс. 2006 г.
«PHP, MySQL, XML. Программирование для Интернета»
Елена Бенкен. БХВ-Петербург. 2007 г.
«Профессиональное программирование на PHP»
Джордж Шлосснейгл. Вильямс. 2006 г.
Слайд 3Объектно-ориентированное программирование на PHP
Слайд 4ООП на PHP
Определение класса
Класс – набор данных (свойств) и функций
(методов) для работы с этими данными.
определение свойств
// определение методов
}
// Инициализация класса (создание объекта)
$myObj = new MyClass();
?>
Слайд 5ООП на PHP
Свойства класса
= “value2”;
private $property3;
}
// Доступ к свойствам класса
$myObj = new
MyClass();
$myObj->property1;
// Изменение значения свойств
$myObj->property2 = “other_value”;
?>
Слайд 6ООП на PHP
Методы класса
// операторы
}
}
// Вызов метода
$myObj = new MyClass();
$myObj->myMethod(‘value1’,’value2’);
?>
Слайд 7ООП на PHP
Спецификаторы доступа
Спецификаторы доступа (public, protected, private) позволяют установить
различный уровень доступа к свойствам и методам класса
Public (общедоступные) –
доступ без ограничений
Protected (защищенные) – доступны внутри класса, в котором они были объявлены, а также во всех дочерних от него классах
Private (частные) – доступ можно получить только в классе, в котором объявлены данные свойства и методы
Если не указать явно спецификатор доступа, то по-умолчанию используется уровень public.
Слайд 8ООП на PHP
Спецификаторы доступа. Пример
$protected = 2;
private $private = 3;
function myMethod(){
echo $this->protected;
echo $this->private;
}
}
class NewClass
extends MyClass {
function newMethod(){
echo $this->protected;
echo $this->private; // Не работает!!!
}
}
$obj = new MyClass();
echo $obj->public;
$obj->myMethod();
$obj1 = new NewClass();
$obj1->newMethod();
echo $obj->protected; // Не работает!
echo $obj->private; // Не работает!
?>
Слайд 9ООП на PHP
Указатель $this
Вывод значения свойства
print($this->property1);
}
function callMethod(){
// Вызов метода
$this->myMethod();
}
}
?>
Слайд 10ООП на PHP
Конструкторы и деструкторы
Конструктор класса – это метод, который
вызывается сразу же, как только создан экземпляр класса
Конструктором класса является
специальный метод __construct()
Если при создании объекта не найден метод __construct(), PHP 5 будет пытаться выполнить метод, чье имя совпадает с именем класса (для совместимости с PHP 4)
Конструкторы часто используются для задания начальных значений
Деструктор класса – это метод, который вызывается при уничтожении объекта (при помощи конструкции unset(), либо при завершении работы сценария)
Деструктором класса является специальный метод __destruct()
Деструкторы класса впервые появились в PHP 5
Слайд 11ООП на PHP
Конструкторы и деструкторы. Пример
__construct($var){
$this->property = $var;
echo "Вызван конструктор";
}
function __destruct(){
echo "Вызван деструктор";
}
}
//Вызов конструктора
$obj =
new MyClass(“Значение”);
//Вызов деструктора
unset($obj);
?>
Слайд 12ООП на PHP
Копирование объектов
Объекты передаются по ссылке, а не по
значению
Для явного копирования объектов используется метод __clone()
= new MyClass(); // Создаем объект на базе класса
$myObj->property = 1;
$myObj2 = $myObj; // Копирование с стиле PHP4. В PHP5 // $myObj2 всего лишь ссылка на $myObj
$myObj2->property = 2; // Изменяя $myObj2 мы изменяем $myObj
$myObj3 = clone $myObj;// Копируем $myObj со всеми данными. // $myObj и $myObj3 два разных объекта
$myObj3->property = 3;
print($myObj->property); // Печатает 2
print($myObj2->property); // Печатает 2
print($myObj3->property); // Печатает 3
?>
Слайд 13ООП на PHP
Метод __clone()
Объект копируется полностью, со всеми свойствами,
методами и их значениями
К методу __clone() нельзя обратиться непосредственно,
для копирования используется ключевое слово clone
Метод __clone() можно явно определить в классе, что позволит изменить значения свойств копируемого объекта
Метод __clone() не может принимать никакие аргументы, однако позволяет обратиться к получаемому объекту через указатель $this
Слайд 14ООП на PHP
Перегрузка метода __clone()
2;
}
}
$myObj = new MyClass();
$myObj->property = 1;
$myObj2 = clone $myObj;
print($myObj->property); //
Печатает 1
print($myObj2->property); // Печатает 2
?>
Слайд 15ООП на PHP
Практическая работа
1. Создайте класс User со свойствами name,
login password. Создайте три объекта не его основе. Задайте значения
свойств объектам.
2. В классе User опишите метод getInfo(), выводящий значения свойств объекта. Вызовите метод для всех объектов.
3. В классе User опишите конструктор, который будет задавать начальные значения свойствам объекта.
Слайд 16ООП на PHP
Наследование
На основе существующих классов можно создавать новые
(дочерние) классы, которые будут расширять функциональность базовых (родительских) классов
Для
указания родительского класса используется ключевое слово extends
Дочерний класс использует все свойства и методы родительского класса
Слайд 17ООП на PHP
Наследование. Пример
$this->numWheels;
}
}
class Toyota extends Car {
public $country = ‘Japan’;
function printCountry() {
echo
$this->country;
}
}
$myCar = new Toyota();
$myCar->printWheels();
$myCar->printCountry();
?>
Слайд 18ООП на PHP
Обработка исключений
Конструкция throw генерирует исключение
Внутри блока
try размещается код, в котором ожидается возникновение исключительной ситуации
Внутри
блока catch происходит перехват и обработка исключительной ситуации
Можно использовать несколько блоков catch
Можно создавать собственные классы исключений, производные от встроенного класса Exception
Слайд 19ООП на PHP
Обработка исключений. Пример
== 0) throw new Exception("Деление на 0!");
echo $a/$b;
}catch(Exception $e){
echo "Произошла
ошибка - ",
$e->getMessage(), // Выводит сообщение
" в строке ",
$e->getLine(), // Выводит номер строки
" файла ",
$e->getFile(); // Выводит имя файла
}
?>
Слайд 20ООП на PHP
Генерация собственных исключений
{
parent::__construct($message);
}
}
try {
$a = 1;
$b = 0;
if ($b == 0) throw
new MathException("Деление на 0!");
echo $a / $b;
} catch (MathException $e) {
echo "Произошла математическая ошибка ",
$e->getMessage(),
" в строке ", $e->getLine(),
" файла ", $e->getFile();
}
?>
Слайд 21ООП на PHP
Абстрактные методы и классы
Абстрактные методы имеют только
объявление и не имеют реализации
Если в классе присутствует хотя
бы один абстрактный метод, класс должен быть также объявлен как абстрактный
Абстрактные классы могут содержать как абстрактные, так и не абстрактные методы
Невозможно создать объект абстрактного класса (можно лишь определять классы-потомки от родительских абстрактных классов)
Для обозначения абстрактного класса или абстрактного метода используется ключевое слово abstract
Слайд 22ООП на PHP
Абстрактные методы и классы. Пример
function startEngine();
}
class InjectorCar extends Car {
public function startEngine(){
print(‘Инжекторный двигатель завёлся!’);
}
}
$myMegaCar
= new InjectorCar();
$myMegaCar->startEngine();
?>
Слайд 23ООП на PHP
Интерфейсы
Интерфейсы – это абстрактные классы, которые не
содержат свойств и имеют только абстрактные методы
В PHP 5
класс не может быть порожден от нескольких классов, однако класс может быть создан на основе нескольких интерфейсов
Для обозначения интерфейса используется ключевое слово interface
Перед описанием методов интерфейса НЕ нужно указывать ключевое слово abstract
При формировании класса на основе интерфейсов используется ключевое слово implements (а не extends)
Слайд 24ООП на PHP
Интерфейсы. Пример
Human implements Hand, Foot {
public function UseKeyboard(){
print(‘Поработали с клавиатурой!’);
}
public function
PlayFootball(){
print(‘Поиграли в футбол!’);
}
}
$vasya = new Human();
$vasya->UseKeyboard();
$vasya->PlayFootball();
?>
Слайд 25ООП на PHP
Финальные методы и классы
Финальный метод не может
быть переопределен в классах, производных от данного класса
Для обозначения
финального метода, перед ним указывается ключевое слово final
Финальный класс не может иметь потомков
Для обозначения финального класса, перед ним указывается ключевое слово final
Если класс обозначен, как финальный, то все его методы автоматически становятся финальными (указывать ключевое слово final перед ними нет необходимости)
Слайд 26ООП на PHP
Финальные методы и классы. Пример
Sum($a,$b){ // Финальный метод
return $a + $b;
}
}
class Algebra extends Mathematics {
public
function Sum($a,$b){ // Возникнет ошибка
$c = $a + $b;
return $c;
}
}
?>
final class Breakfast { // Финальный класс
function eatFood($food){
print(“Скушали $food!”);
}
}
class McBreakfast extends Breakfast {...}// Возникнет ошибка
?>
Слайд 27ООП на PHP
Константы класса
Для объявления константы класса используется ключевое слово
const
class Human {
const HANDS = 2;
}
К константе класса нельзя обратиться
через объект. Для доступа к константе используется оператор “::”.
print (‘Количество рук: ‘ . Human::HANDS);
Внутри класса к константе можно обратиться через ключевое слово self (через $this – нельзя!)
print (self::HANDS);
Слайд 28ООП на PHP
Статические свойства и методы класса
Статические свойства едины
для всего класса и не принадлежат конкретному экземпляру класса (объекту)
При изменении статического свойства в одном из методов любого объекта, его значение меняется и для всех остальных объектов класса
Для объявления статического свойства используется кл. слово static
К статическим свойствам можно обращаться вне контекста объекта (через оператор “::”)
Статические методы едины для всего класса и не принадлежат конкретному экземпляру класса (объекту)
Для объявления статического метода используется кл. слово static
К статическим методам можно обращаться вне контекста объекта (через оператор “::”)
Внутри статического метода НЕЛЬЗЯ использовать указатель $this
Слайд 29ООП на PHP
Статические свойства класса. Пример
0; // Статическое свойство
function __construct(){
++self::$zceCount;
}
}
$vasya = new ZendCertifiedEngineer();
$petya = new
ZendCertifiedEngineer();
print ('Текущее количество ZCE: ' . ZendCertifiedEngineer::$zceCount);
?>
class Rally {
static function welcome(){ // Статический метод
print ('Добро пожаловать на ралли');
}
}
print (Rally::welcome());
?>
Слайд 30ООП на PHP
instanceof
instanceof позволяет определить:
является ли объект экземпляром конкретного
класса
является ли объект экземпляром класса, производного от какого-либо класса
является ли объект производным какого-либо интерфейса
class Human {}
$myBoss = new Human();
if($myBoss instanceOf Human)
print('Мой Босс – человек!');
?>
Слайд 31ООП на PHP
Методы доступа к свойствам объекта
Метод доступа __get()
позволяет проводить динамическое чтение значение свойств объектов
В качестве параметра
методу __get() передается имя свойства
Метод доступа __set() позволяет проводить динамическое назначение значений свойств объектов
В качестве параметров методу __set() передаются имя свойства и устанавливаемое значение
Слайд 32ООП на PHP
Методы доступа к свойствам. Пример
__get($name){
print("Чтение значения свойства $name ");
return $this->properties[$name];
}
function __set($name,$value){
print("Задание нового свойства $name
= $value");
$this->properties[$name] = $value;
}
}
$obj = new MyClass;
$obj->property = 1; // Задание нового свойства property = 1
$a = $obj->property; // Чтение значения свойства property
print $a; // 1
?>
Слайд 33ООП на PHP
Перебор свойств объекта
В PHP 5 можно перебирать все
свойства объекта в операторе foreach
$yearOfBorn){
$this->name = $name;
$this->yearOfBorn = $yearOfBorn;
}
}
$billGates = new Human('Bill Gates',1955);
foreach($billGates as $name=>$value){
print($name.': '.$value.'
');
}
?>
Слайд 34ООП на PHP
Практическая работа
1. Опишите класс SuperUser на основе класса
User. В классе опишите свойство $role и метод getInfo()
2. Опишите
конструктор, в котором генерируйте исключение если введены не все данные. Опишите перехват исключения и выведите сообщение об ошибке.
3. В классах User и SuperUser опишите статические свойства для подсчета количества объектов. Присвойте этим свойствам начальные значения (0), в конструкторе инкрементируйте их. После создания объектов, выведите количество объектов на экран.
Слайд 36PHP и SQLite
SQLite – библиотека, написанная на языке С
Осуществляет механизм работы с данными с помощью SQL
Реализованы как
серверные, так и клиентские функции
Данные записываются в файл на диске
Слайд 37PHP и SQLite
Преимущества
Полностью бесплатна
Нет необходимости в средствах администрирования
– права доступа реализуются файловой системой сервера
Бестиповая СУБД (все
данные хранятся в виде строк)
Высокая производительность
Легкая переносимость
Поддержка процедурного и объектно-ориентированного интерфейсов
Хранение данных объемом до 2 терабайт
Хранение строк и бинарных данных неограниченной длины
Слайд 39PHP и SQLite
Ограничения
SQLite предназначен для небольших и средних приложений
Основной выигрыш в производительности, если преобладают операции вставки и выборки
данных
При чрезвычайно активном обращении к данным, или в случае частых сортировок, SQLite работает медленнее своих конкурентов
Слайд 40PHP и SQLite
Открытие и закрытие соединения
PDO("sqlite:/var/www/html/sqlite.db");
// Выполняем какие-то действия
// Закрываем соединение
unset($db);
?>
Слайд 41PHP и SQLite
Создание таблицы
При описании полей таблицы SQLite игнорирует
всё, кроме имен полей и сочетания INTEGER PRIMARY KEY
Указание
типов полей и их длины является необязательным
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER(2)
);
В SQLite идентично:
CREATE TABLE users
(id INTEGER PRIMARY KEY, name, age);
Слайд 42PHP и SQLite
Выполнение запроса
"CREATE TABLE users (id INTEGER PRIMARY KEY,
name, login ,password)";
$result
= $db->query($sql);
// Закрываем соединение
unset($db);
?>
Слайд 43PHP и SQLite
Экранирование спецсимволов
htmlspecialchars($db->quote("Д'Артаньян"));
$login = htmlspecialchars($db->quote("Ссылка"));
$password = htmlspecialchars($db->quote("fbnc);akefvfi"));
$sql = "INSERT INTO users
('name', 'login', 'password')
VALUES ($name,$login,$password)";
$db->query($sql) or die("Ошибка выполнения запроса");
echo "Добавили в базу: $name, $login, $password
";
// Закрываем соединение
unset($db);
?>
Слайд 44PHP и SQLite
Идентификатор последней записи
"id: ".$db->lastInsertId();
// Закрываем соединение
unset($db);
?>
Слайд 45PHP и SQLite
Обработка результатов запроса
"SELECT * FROM users";
$result = $db->query($sql) or die("Ошибка выполнения запроса");
while($row
= $result->fetch()){
echo $row['id']." ".$row['name']." ".$row['login']." ".$row['password']."
";
}
unset($db);
?>
$db = new PDO("sqlite:../sqlite.db");
$sql = "SELECT * FROM users";
$result = $db->query($sql) or die("Ошибка выполнения запроса");
foreach ($result->fetchAll() as $row => $value){
echo $value['id']." ".$value['name']." ".$value['login']." ".$value['password']."
";
}
unset($db);
?>
Слайд 46PHP и SQLite
Демонстрация
Открытие соединения с БД
Создание таблицы
Фильтрация пользовательских данных
Добавление данных
в таблицу и получение ID последней записи
Обработка результатов выборки
Закрытие соединения
to create database"); $sql = "CREATE TABLE catalog (id INTEGER PRIMARY KEY, name VARCHAR(50), price
VARCHAR(15))"; $this->db->query($sql) or die("Unable to create table"); }else $this->db = new PDO('sqlite:'.$conn) or die("Unable to connect to database"); } function __destruct(){ unset($db); } function insert($name,$price){ $name = htmlspecialchars($this->db->quote(trim($name))); $price = htmlspecialchars($this->db->quote(trim($price))); $sql = "INSERT INTO catalog (name, price) VALUES ($name,$price)"; $this->db->query($sql) or die("Unable to execute query"); } function select(){ $sql = "SELECT * FROM catalog"; $result = $this->db->query($sql) or die ("Unable to execute query"); return $result; } } $eshop = new Eshop('C:\Program Files\Apache Group\Apache2\htdocs'); if(isset($_POST['name']) && isset($_POST['price']) && $_POST['name'] != '' && $_POST['price'] != '') $eshop->insert($_POST['name'],$_POST['price']);?>
select(); foreach($catalog->fetchAll() as $row){ echo $row['name'].' '.$row['price'].'
'; }?>
Слайд 48PHP и SQLite
Практическая работа
1. Опишите класс Eshop, в нем определите
свойство $db для хранения объекта БД
2. В конструкторе сделайте проверку
на существование файла БД. Если база не существует, создайте ее, а так же таблицу catalog в ней и соединитесь с БД. В противном случае просто соединитесь с БД.
3. В деструкторе закрывайте соединение с БД.
4. В классе опишите метод insert(), который будет содержать SQL-запрос на добавление данных в таблицу catalog
5. Получите данные из формы, отфильтруйте их и сохраните в БД с помощью вышеописанного метода.
6. Выведите данные по строкам в составе HTML-таблицы
Слайд 50PHP и XML
XML (Extensible Markup Language)
Расширяемый язык разметки
Предназначен для:
хранения структурированных данных
обмена информацией между программами
создания на его
основе других, более специализированных, языков разметки
Цель создания:
обеспечение совместимости при передаче структурированных данных между разными системами обработки информации
Л.Аткинсон
PHP5. Библиотека профессионала
2005 448
Д.Коггзолл
PHP5. Полное руководство
2006
336
Слайд 52PHP и XML
Синтаксис
XML-документ состоит из вложенных элементов
XML чувствителен
к регистру символов
Элемент состоит из открывающего и закрывающего тегов,
а также содержимого Vasya Pupkin
Возможно формирование пустых элементов – без содержимого
Элементы могут иметь атрибуты ...
Слайд 53PHP и XML
Правила
Если документ содержит символы, выходящие за рамки
ASCII, необходимо указать кодировку
Все парные теги должны быть закрыты
Теги должны быть правильно вложены друг в друга
Значения атрибутов заключаются в одинарные или двойные кавычки
У каждого конкретного элемента не должно быть повторяющихся атрибутов
Должен существовать только один корневой элемент, который содержит все остальные элементы
Пустой документ (без корневого элемента) - недопустим
Слайд 54PHP и XML
Средства PHP5 для работы с XML
DOM (Document
Object Model) - чтение, модификация и создание новых XML-документов
SAX
(Simple API for XML) - получение информации из XML-документа
XSLT (Extensible Stylesheet Language Transformations) - преобразование XML-документов в другие форматы
SimpleXML - чтение и модификация XML-документов
Слайд 55PHP и XML
SAX (Simple API for XML)
Не является
стандартом W3C
Описывает метод парсинга XML-документов для получения данных из
них
Создавать и изменять XML-документы с помощью SAX невозможно
Основан на событиях
XML-парсеру предоставляется набор собственных функций для обработки различных типов XML-данных
Парсер автоматически вызывает эти функции в процессе последовательной обработки XML-документа
Слайд 56PHP и XML
SAX. Создание парсера
$xml = xml_parser_create("UTF-8");
Создает новый XML-парсер
Возвращает ресурс
Необязательный аргумент encoding указывает кодировку
Слайд 57PHP и XML
Обработка открывающего XML-элемента
function start_tag_handler ($xml, $tag, $attributes){
...
}
Аргументы:
Ссылка
на XML-парсер (ресурс)
Название элемента
Ассоциативный массив атрибутов элемента
Слайд 58PHP и XML
Обработка текстового узла
function character_handler ($xml, $data){
...
}
Аргументы:
Ссылка на
XML-парсер (ресурс)
Текстовые данные
Слайд 59PHP и XML
Обработка закрывающего XML-элемента
function end_tag_handler ($xml, $tag){
...
}
Аргументы:
Ссылка на
XML-парсер (ресурс)
Название элемента
Слайд 60PHP и XML
Регистрация обработчиков элементов
xml_set_element_handler($xml,
"start_tag_handler",
"end_tag_handler");
Регистрирует функции обработки начала и конца
XML-элемента
Атрибуты:
Ссылка на XML-парсер (ресурс)
Название функции обработки начала элемента
Название функции обработки конца элемента
Слайд 61PHP и XML
Регистрация обработчика текстовых узлов
xml_set_character_data_handler($xml, "character_handler");
Регистрирует функции обработки текстового
узла
Атрибуты:
Ссылка на XML-парсер (ресурс)
Название функции обработки текстового узла
Слайд 62PHP и XML
Парсинг XML-документа
xml_parse($xml, file_get_contents("catalog.xml"));
Начинает процесс парсинга XML-документа
Атрибуты:
Ссылка на
XML-парсер (ресурс)
XML-данные для разбора
Слайд 63PHP и XML
SAX. Пример
$tag != 'BOOK') echo "";
if($tag == 'BOOK') echo "";
}
function end_tag_parse($xml,
$tag){
if($tag != 'CATALOG'){
if($tag == 'BOOK') echo "";
if($tag != 'BOOK') echo "";
}
}
function character_parse($xml, $data){
echo $data;
}
$xml = xml_parser_create("UTF-8");
xml_set_element_handler($xml,"start_tag_parse","end_tag_parse");
xml_set_character_data_handler($xml, "character_parse");
?>
Автор | Название |
Год издания | Цена |
xml_parse($xml, file_get_contents("catalog.xml")); ?>
Слайд 64PHP и XML
XSLT (Extensible Stylesheet Language Transformations)
Стилевая технология, предназначенная
для трансформации XML-документов в другие форматы
Таблицы стилей XSL создаются
по правилам XML-документов
Таблицы стилей XSL состоят из набора шаблонов
Слайд 65PHP и XML
Корневой элемент XSL-документа
...
Слайд 66PHP и XML
Описание формата вывода
Слайд 67PHP и XML
Описание XSL-шаблона
...
В атрибуте match указывается узел, к
которому будет применяться данный шаблон
Слайд 68PHP и XML
Цикл for-each
...
...
В атрибуте select элемента
for-each указывается узел, к которому будет применяться данный цикл.
В атрибуте
select элемента value-of указывается имя узла, содержимое которого нужно получить.
Слайд 69PHP и XML
Применение таблицы XSL к XML-документу на стороне клиента
version="1.0" encoding="UTF-8"?>
С.Хьюз
PHP кукбук
Слайд 70PHP и XML
Применение таблицы XSL к XML-документу на стороне сервера
= new DOMDocument();
$xml->load("catalog.xml");
$xsl = new DOMDocument();
$xsl->load("catalog.xsl");
$processor = new XSLTProcessor();
$processor->importStylesheet($xsl);
$html =
$processor->transformToXml($xml);
echo $html;
?>
Слайд 71PHP и XML
XSLT. Пример
match="/">
XSLT
Автор
Название |
Год |
Цена |
|
|
|
|