Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałWalery Życiński Został zmieniony 9 lat temu
1
Piotr Czapiewski Wydział Informatyki ZUT Wykład 2
7
$this – wskazuje na bieżący obiekt
8
W ciele metody – użycie $this jest konieczne $this->nazwa – pole klasy $nazwa – zmienna lokalna Wynik: hau hau Wynik: hau hau Wynik: Wynik:
9
W metodzie statycznej – odnosi się do obiektu wołającego
11
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" }
12
Trzy warianty: Przypisanie Referencja Klonowanie
13
Zwierze { gatunek : "pies" } Zwierze { gatunek : "pies" } $a $b $c $a = new Zwierze("pies"); $b = $a; $c = &$a;
14
Zwierze { gatunek : "żyrafa" } Zwierze { gatunek : "żyrafa" } $a $b $c $a = new Zwierze("pies"); $b = $a; $c = &$a; $b->gatunek = "żyrafa";
15
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" }
16
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;
17
$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" }
19
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
20
var1 => value 1 var2 => value 2 var3 => value 3 var1 => value 1 var2 => value 2 var3 => value 3
21
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
23
Standardowe funkcje i wyrażenia nie rzucają wyjątków Wynik:
24
Rozwiązanie: set_error_handler()
25
PHP Data Objects (PDO)
26
Biblioteki dedykowane Warstwy abstrakcji Mapowanie obiektowo-relacyjne
27
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
30
$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} "; }
31
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];
32
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"; }
34
Problem: Budujemy zapytanie na podstawie danych pobranych z żądania HTTP
36
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ść
39
Rozpoczęcie transakcji $dbh->beginTransaction(); Zatwierdzenie transakcji $dbh->commit(); Wycofanie transakcji $dbh->rollBack();
41
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
45
Biblioteka Doctrine ORM
46
ORM – Object-Relational Mapping Odwzorowanie obiektów w aplikacji na tabele w bazie danych Operacje na obiektach dziedzinowych zamiast SQL Koncepcja ORM Doctrine ORM, http://www.doctrine-project.orghttp://www.doctrine-project.org Propel, http://propelorm.orghttp://propelorm.org Eloquent ORM, http://laravel.comhttp://laravel.com Biblioteki ORM dla PHP
47
ksiazki id tytul autor wydawnictwo wydawnictwa id nazwa
48
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
49
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; }
50
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; }
51
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"; }
52
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();
53
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();
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.