Piotr Czapiewski Wydział Informatyki ZUT Wykład 2.

Slides:



Advertisements
Podobne prezentacje
Projektowanie Aplikacji Komputerowych
Advertisements

Object-Relational Mapper for PHP
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Wprowadzenie do języka skryptowego PHP – cz. 2
Bezpieczeństwo wyjątków w C++: OpenGL
Odwzorowanie obiektowo-relacyjne
18/11/ Języki programowania 1 Piotr Górczyński Biblioteki.
PHP + MySQL część II.
Jan Aleksander Wierzbicki
Programowanie obiektowe w Javie
Marcin Pamuła Mateusz Stefek
Visual Studio Codename „Orcas”, LINQ
OOP - programowanie zorientowane obiektowo w VB.NET
25/08/ Języki programowania 1 Piotr Górczyński Obiekty i zdarzenia.
Model – View - Controler
Data powstania: 2001 rok Autor i lider: Gavin King Najnowsza wersja: Licencja: Open Source.
DZIEDZICZENIE · klasy bazowe i klasy pochodne WyświetlAutora( ) Autor
ODE Informacje wstępne. Pojęcia podstawowe n Obiektowa baza danych u język komunikacji u ziarnistość obiektów u identyfikacja obiektów n Transakcja -
Hibernate Klasy trwałe
Odwzorowania relacyjno-obiektowe Hibernate Tranzakcyjność i bezpieczeństwo danych.
C++ wykład 5 ( ) Dziedziczenie.
Wykład 8 Wojciech Pieprzyca

Odwzorowania relacyjno-obiektowe Hibernate Klasy trwałe.
Hibernate relacje.
Hibernate uzupełnienie
Odwzorowania relacyjno-obiektowe Hibernate Tranzakcyjność i bezpieczeństwo danych.
Programowanie urządzeń mobilnych – wykład IV
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 7.
Podstawy inżynierii oprogramowania Zofia Kruczkiewicz
PIO 3_2, Zofia Kruczkiewicz1 Wykład 3 – część druga Iteracyjno-rozwojowy cykl oprogramowania 3.
Programowanie obiektowe III rok EiT
SQL - Structured Query Language
Java – coś na temat Klas Piotr Rosik
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
PIO 2_2, Zofia Kruczkiewicz1 Wykład 2 – część druga Iteracyjno-rozwojowy cykl oprogramowania 2.
Aplikacje bazodanowe ADO.NET PHP i MySQL
Warsztaty C# Część 6 Grzegorz Piotrowski Grupa .NET PO
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 8.
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 3.
Programowanie obiektowe 2013/2014
Zpiratował Rafał Kaczyński. Jest to technologia pozwalająca mapować dane obiektowe na odpowiadające im struktury w bazach danych. Hibernate pozwala na.
Kurs języka C++ – wykład 5 ( )
Wykład 3 Programowanie obiektowe. Dokument HTML składa się z obiektów (standardowych i utworzonych przez użytkownika). Głównym obiektem jest document,
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Projektowanie Aplikacji Internetowych Artur Niewiarowski Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska.
Responsywne aplikacje w Windows 8 i.NET 4.5 Jakub Binkowski.
Technologie programowania systemów internetowych
Technologie internetowe Wykład 7 Kontrola danych użytkownika.
Entity Framework worth it or not?
Waldemar Bartyna Pytania egzaminacyjne 1.
1 SBD, L.Banachowski Oprogramowanie strony serwera cz. 1 Powtórzenie wyk ł adu 6.
Hibernate Podstawy.
Odwzorowania relacyjno-obiektowe Hibernate Podstawy.
.NET i Bazy Danych Projekt: Wadim Grasza.
Wykład 4 Programowanie obiektowe. Tworzenie własnych obiektów Słowo kluczowe this W JavaScript można tworzyć własne obiekty. Wykorzystuje się tu zapis.
Partnerstwo dla Przyszłości 1 Lekcja 27 Klasy i obiekty.
Object-relational mapping (aka O/RM, ORM, and O/R mapping)
Partnerstwo dla Przyszłości 1 Lekcja 28 Dziedziczenie i rodzaje dziedziczenia.
Waldemar Bartyna Pytania egzaminacyjne 1.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
PHP (wstęp) Personal Home Page Tools (PHP Tools)
Programowanie Obiektowe – Wykład 6
(według:
Programowanie Obiektowe – Wykład 2
Strukturalny język zapytań SQL - historia
Technologie Informacyjne Bazy danych
Wykład 1-część druga Wstęp do inżynierii oprogramowania.
Zapis prezentacji:

Piotr Czapiewski Wydział Informatyki ZUT Wykład 2

 $this – wskazuje na bieżący obiekt

 W ciele metody – użycie $this jest konieczne  $this->nazwa – pole klasy  $nazwa – zmienna lokalna Wynik: hau hau Wynik: hau hau Wynik: Wynik:

 W metodzie statycznej – odnosi się do obiektu wołającego

 Przypisanie istniejącego obiektu do nowej zmiennej  Nowa zmienna będzie odnosić się do tej samej instancji object(Zwierze)#1 (2) { ["gatunek"]=> string(4) "pies" ["odglos"]=> NULL }object(Zwierze)#1 (2) { ["gatunek"]=> string(4) "pies" ["odglos"]=> string(7) "hau hau" }object(Zwierze)#1 (2) { ["gatunek"]=> string(4) "pies" ["odglos"]=> NULL }object(Zwierze)#1 (2) { ["gatunek"]=> string(4) "pies" ["odglos"]=> string(7) "hau hau" }

 Trzy warianty:  Przypisanie  Referencja  Klonowanie

Zwierze { gatunek : "pies" } Zwierze { gatunek : "pies" } $a $b $c $a = new Zwierze("pies"); $b = $a; $c = &$a;

Zwierze { gatunek : "żyrafa" } Zwierze { gatunek : "żyrafa" } $a $b $c $a = new Zwierze("pies"); $b = $a; $c = &$a; $b->gatunek = "żyrafa";

Zwierze { gatunek : "żyrafa" } Zwierze { gatunek : "żyrafa" } $a $b $c $a = new Zwierze("pies"); $b = $a; $c = &$a; $b->gatunek = "żyrafa"; $a = new Zwierze("kot"); Zwierze { gatunek : "kot" } Zwierze { gatunek : "kot" }

Zwierze { gatunek : "pies" } Zwierze { gatunek : "pies" } $a $b $c $a = new Zwierze("pies"); $b = $a; $c = &$a; $b->gatunek = "żyrafa"; $a = new Zwierze("kot"); $c = null;

 $klon = clone $oryginal  Kopia wszystkich właściwości obiektu  Opcjonalnie: funkcja __clone() Zwierze { gatunek : "pies" } Zwierze { gatunek : "pies" } $a $b $a = new Zwierze("pies"); $b = clone $a; Zwierze { gatunek : "pies" } Zwierze { gatunek : "pies" }

 Brak dziedziczenia wielorakiego  Można nadpisać metody klasy bazowej  Dostęp do nadpisanych metod klasy nadrzędnej – parent::  Nie można nadpisać metody zdefiniowanej jako final

var1 => value 1 var2 => value 2 var3 => value 3 var1 => value 1 var2 => value 2 var3 => value 3

var1 => value 1 var2 => value 2 var3 => value 3 MyClass::iterateVisible: var1 => value 1 var2 => value 2 var3 => value 3 prot => protected var priv => private var var1 => value 1 var2 => value 2 var3 => value 3 MyClass::iterateVisible: var1 => value 1 var2 => value 2 var3 => value 3 prot => protected var priv => private var

 Standardowe funkcje i wyrażenia nie rzucają wyjątków  Wynik:

 Rozwiązanie: set_error_handler()

PHP Data Objects (PDO)

Biblioteki dedykowane Warstwy abstrakcji Mapowanie obiektowo-relacyjne

Różne DBMS = różne interfejsy MySQL, PostgreSQL, Oracle, Informix, DB2, Microsoft SQL Server, Firebird, Paradox, Sybase, SQLite… Sposób klasyczny: biblioteki dedykowane PHP Data Objects Różne DBMS = jeden interfejs Nie rozwiązuje problemu niezgodności wersji SQL Warstwa abstrakcji: PDO

$sql = 'SELECT * from ksiazki'; $result = $dbh->query($sql); foreach($result as $row) { $id = $row['id']; $tytul = $row['tytul']; $autor = $row['autor']; echo "{$autor}: {$tytul} "; } $sql = 'SELECT * from ksiazki'; $result = $dbh->query($sql); foreach($result as $row) { $id = $row['id']; $tytul = $row['tytul']; $autor = $row['autor']; echo "{$autor}: {$tytul} "; }

print_r($row); Array ( [id] => 2 [0] => 2 [tytul] => PHP dla opornych [1] => PHP dla opornych [autor] => Jan Kowalski [2] => Jan Kowalski [wydawnictwo] => 2 [3] => 2 ) Array ( [id] => 2 [0] => 2 [tytul] => PHP dla opornych [1] => PHP dla opornych [autor] => Jan Kowalski [2] => Jan Kowalski [wydawnictwo] => 2 [3] => 2 ) $id = $row['id']; $id = $row[0]; $t = $row['tytul']; $t = $row[1]; $id = $row['id']; $id = $row[0]; $t = $row['tytul']; $t = $row[1];

class Ksiazka { public $id; public $tytul; public $autor; public $wydawnictwo; } $statement = $dbh->query('SELECT * from ksiazki'); $ksiazki = $result->fetchAll(PDO::FETCH_CLASS, 'Ksiazka'); foreach($ksiazki as $k) { echo "{$k->autor}: {$k->tytul}\n"; } class Ksiazka { public $id; public $tytul; public $autor; public $wydawnictwo; } $statement = $dbh->query('SELECT * from ksiazki'); $ksiazki = $result->fetchAll(PDO::FETCH_CLASS, 'Ksiazka'); foreach($ksiazki as $k) { echo "{$k->autor}: {$k->tytul}\n"; }

 Problem:  Budujemy zapytanie na podstawie danych pobranych z żądania HTTP

 Zwykłe połączenie jest zamykane po zakończeniu skryptu  Połączenie trwałe jest zachowywane do późniejszego wykorzystania  Poprawa wydajności  Nie wpływa na funkcjonalność

 Rozpoczęcie transakcji  $dbh->beginTransaction();  Zatwierdzenie transakcji  $dbh->commit();  Wycofanie transakcji  $dbh->rollBack();

 Tryby obsługi błędów w PDO  Tryb cichy – PDO::ERRMODE_SILENT ▪ W razie wystąpienia błędu ustawiane są kody błędu w obiektach PDO ▪ Informacje o błędzie do pobrania za pomocą: PDO::errorCode(), PDO::errorInfo()  Tryb ostrzeżeń – PDO::ERRMODE_WARNING ▪ Dodatkowo emitowane ostrzeżenie  Tryb wyjątków – PDO::ERRMODE_EXCEPTION ▪ Rzucany jest wyjątek PDOException

Biblioteka Doctrine ORM

ORM – Object-Relational Mapping Odwzorowanie obiektów w aplikacji na tabele w bazie danych Operacje na obiektach dziedzinowych zamiast SQL Koncepcja ORM Doctrine ORM, Propel, Eloquent ORM, Biblioteki ORM dla PHP

ksiazki id tytul autor wydawnictwo wydawnictwa id nazwa

 Konfiguracja  Generowanie mapowania na podstawie istniejącej bazy danych  Generowanie klas encji na podstawie mapowania doctrine.bat orm:convert:mapping --from-database xml config\xml doctrine.bat orm:generate:entities model bootstrap.php, cli-config.php

class Wydawnictwo { private $id; private $nazwa; public function getId() { return $this->id; } public function getNazwa() { return $this->nazwa; } public function setNazwa($nazwa) { $this->nazwa = $nazwa; return $this; } class Wydawnictwo { private $id; private $nazwa; public function getId() { return $this->id; } public function getNazwa() { return $this->nazwa; } public function setNazwa($nazwa) { $this->nazwa = $nazwa; return $this; }

class Ksiazka { private $id; private $tytul; private $autor; private $wydawnictwo; public function getTytul() { return $this->tytul; }... public function getWydawnictwo() { return $this->wydawnictwo; } public function setWydawnictwo(\Wydawnictwo $wydawnictwo = null) { $this->wydawnictwo = $wydawnictwo; return $this; } class Ksiazka { private $id; private $tytul; private $autor; private $wydawnictwo; public function getTytul() { return $this->tytul; }... public function getWydawnictwo() { return $this->wydawnictwo; } public function setWydawnictwo(\Wydawnictwo $wydawnictwo = null) { $this->wydawnictwo = $wydawnictwo; return $this; }

 Zapytanie w języku DQL $dql = "SELECT b FROM Ksiazka b"; $query = $entityManager->createQuery($dql); $ksiazki = $query->getResult(); foreach ($ksiazki as $k) { $id = $k->getId(); $tytul = $k->getTytul(); $nazwaWydawcy = $k->getWydawnictwo()->getNazwa(); echo "{$id}: {$nazwaWydawcy}; {$tytul}\n"; } $dql = "SELECT b FROM Ksiazka b"; $query = $entityManager->createQuery($dql); $ksiazki = $query->getResult(); foreach ($ksiazki as $k) { $id = $k->getId(); $tytul = $k->getTytul(); $nazwaWydawcy = $k->getWydawnictwo()->getNazwa(); echo "{$id}: {$nazwaWydawcy}; {$tytul}\n"; }

 Edycja istniejącego obiektu $ksiazka1 = $entityManager->find('Ksiazka', 1); $ksiazka1->setTytul('Zmieniony tytul'); $entityManager->persist($ksiazka1); $entityManager->flush(); $ksiazka1 = $entityManager->find('Ksiazka', 1); $ksiazka1->setTytul('Zmieniony tytul'); $entityManager->persist($ksiazka1); $entityManager->flush();

 Tworzenie nowego obiektu $nowaKsiazka = new Ksiazka(); $nowaKsiazka->setTytul('Testowy tytul'); $nowaKsiazka->setAutor('Jan Kowalski'); $helion = $entityManager->find('Wydawnictwo', 2); $nowaKsiazka->setWydawnictwo($helion); $entityManager->persist($nowaKsiazka); $entityManager->flush(); $nowaKsiazka = new Ksiazka(); $nowaKsiazka->setTytul('Testowy tytul'); $nowaKsiazka->setAutor('Jan Kowalski'); $helion = $entityManager->find('Wydawnictwo', 2); $nowaKsiazka->setWydawnictwo($helion); $entityManager->persist($nowaKsiazka); $entityManager->flush();