Wyższa Szkoła Technologii Teleinformatycznych w Świdnicy Internetowe bazy danych wykład 10 dr inż. Jacek Mazurkiewicz e-mail: Jacek.Mazurkiewicz@pwr.wroc.pl
Struktura klasy tworzenie klasy słowo kluczowe class definicja klasy: atrybuty zadeklarowanie zmiennych wewnątrz klasy słowo kluczowe var: operacja zadeklarowanie funkcji wewnątrz definicji klasy class nazwaklasy class nazwaklasy var $atrybut1; var $atrybut2; class nazwaklasy function operacja1() function operacja2($param1, $param2)
Konstruktory specjalny typ operacji, wywoływany przy tworzeniu obiektu inicjalizacja zadań nadawanie atrybutom wartości tworzenie innych obiektów wymaganych przez dany obiekt deklarowany jak inne operacje, nazwa jak klasa automatyczne wywołanie przy tworzeniu obiektu class nazwaklasy function nazwaklasy($param) echo Konstruktor wywołany z parametrem $param<br> ; brak przeciążania funkcji tylko jedna funkcja o danej nazwie w tym konstruktor
Tworzenie egzemplarzy tworzenie obiektów słowo kluczowe new podać klasę, której obiekt jest członkiem podać nazwę obiektu podać wszystkie parametry wymagane przez konstruktor class nazwaklasy function nazwaklasy($param) echo Konstruktor wywołany z parametrem $param<br> ; $a = new nazwaklasy( Pierwszy ); $a = new nazwaklasy( Drugi ); $a = new nazwaklasy(); Konstruktor wywołany z parametrem Pierwszy Konstruktor wywołany z parametrem Drugi Konstruktor wywołany z parametrem
Stosowanie atrybutów klasy (1) wewnątrz klasy dostęp do wskaźnika $this jeśli nazwa atrybutu $atrybut to odwołanie do niego: $this->atrybut ustawianie i dostęp do atrybutu wewnątrz klasy: class nazwaklasy var $atrybut; function operacja($param) $this->atrybut = $param; echo $this->atrybut ; wszystkie atrybuty i operacje widoczne na zewnątrz klasy wszystkie atrybuty i operacje są publiczne
Stosowanie atrybutów klasy (2) inna składnia poprzedniego zadania class nazwaklasy var $atrybut; $a = new nazwaklasy(); $a->atrybut = wartość ; echo $a->atrybut ; nie jest dobry bezpośredni dostęp do atrybutów spoza klasy funkcje dostępowe zamknięcie dostępu w jednym fragmencie kodu - kapsułkowanie class nazwaklasy var $atrybut; function wez_atrybut() return $this->atrybut; function ustaw_atrybut($nowa_wartosc) $this->atrybut = $nowa_wartosc;
Stosowanie atrybutów klasy (3) dostęp do atrybutu zwrot wartości, przypisanie wartości banalne ale jeden fragment kodu gdzie dostęp do atrybutu możliwość testowania czy dane sensowne function ustaw_atrybut($nowa_wartosc) if($nowa_wartosc >= 0 && $nowa_wartosc <= 100) $this->atrybut = $nowa_wartosc; alternatywa zmiana w wielu miejscach kodu jeden punkt dostępu łatwość zmiany implementacji przechowywanie w bazie danych, szacowanie wartości na podstawie innych atrybutów zawsze jedynie modyfikacja funkcji dostępowych
Wywoływanie operacji klas operacje klas wywoływane podobnie do atrybutów - klasa class nazwaklasy function operacja1() function operacja2($param1, $param2) utworzenie obiektu o nazwie $a operacje wywołane jak inne funkcje z parametrami należy wskazać do którego obiektu operacja przypisana $a->operacja1(); $a->operacja2(12, test ); $x = $a->operacja1(); $y = $a->operacja2(12, test ); jeśli operacje zwracają wartości przypisanie do zmiennych
Dziedziczenie w PHP jeśli klasa ma być podklasą innej słowo kluczowe extends tworzona klasa B dziedziczy od klasy A już zdefiniowanej class B extends A var $atrybut2; function operacja2() class A var $atrybut1; function operacja1() prawidłowe próby dostępu do operacji i atrybutów obiektu B: $b = new B(); $b->operacja1(); $b->atrybut1 = 10; $b->operacja2(); $b->atrybut2 = 10; $a = new A(); $a->operacja1(); $a->atrybut1 = 10; $a->operacja2(); $a->atrybut2 = 10; dziedziczenie w jedną stronę! klasa B jako podklasa A ma taką samą funkcjonalność, dane, ma własny atrybut i operację
Unieważnianie (1) można ponownie zadeklarować te same atrybuty i operacje atrybut podklasy ma inną wartość domyślną niż w nadklasie operacja podklasy ma mieć inną funkcjonalność niż operacja w nadklasie takie działania to unieważnianie class A var $atrybut = domyślna wartość ; function operacja() echo Coś<br> ; echo Wartość \$atrybut wynosi $this->atrybut<br> ; klasa B unieważnia $atrybut i operacja():
Unieważnianie (2) class B extends A var $atrybut = inna wartość ; function operacja() echo Coś innego<br> ; echo Wartość \$atrybut wynosi $this->atrybut<br> ; deklaracja B nie ma wpływu na definicję A $a = new A(); $a->operacja(); Coś Wartość $atrybut wynosi domyślna wartość $b = new B(); $b->operacja(); Coś innego Wartość $atrybut wynosi inna wartość podklasa dziedziczy wszystkie atrybuty i operacje nadklasy zamienniki unieważniają oryginalne definicje PHP nie pozwala na unieważnienie funkcji i późniejsze odwołanie do jej wersji zdefiniowanej w rodzicu
Wielodziedziczenie brak wielodziedziczenia! każda klasa może dziedziczyć tylko od jednego rodzica nie ma ograniczeń w ilości dzieci jednego rodzica A A A B B B C C C dziedziczenie wielodziedziczenie
<?php class ShoppingBasket var $fitems; var $fcurvalue; /* jest to konstruktor klasy, ponieważ ma taką samą nazwę jak klasa. Tak samo jak w C++ konstruktor może posiadać argumenty W tym przypadku jest to początkowa wartość koszyka. Może być to stała prowizja lub rabat.. */ function ShoppingBasket( $ainitialvalue = 0.0 ) $this->fcurvalue = $ainitialvalue; // Dodanie określonej ilości przedmiotów function AddItem( $aname, $avalue, $aquantity = 1 ) $this->fitems[$aname]["quantity"] += $aquantity; $this->fitems[$aname]["value"] = $avalue; $this->fcurvalue += $avalue * $aquantity; return True;
function RemoveItem($aName, $aquantity = 1) // Usuwamy określoną ilość przedmiotów // jedynie, gdy była dostępna wystarczająca ich ilość if ( $this->fitems[$aname]["quantity"] > $aquantity ) $this->fitems[$aname]["quantity"] -= $aquantity; $this->fcurvalue -= $this->fitems[$aname]["value"] * $aquantity; else return False; function PrintBasket( ) if ( count( $this->fitems ) > 0 ) print( "Zawartość koszyka:<blockquote>" ); foreach( $this->fitems as $akey => $avalue ) print( "$avalue['quantity'] $akey<br>" );
print( "Wartość całkowita: $". number_format( $this->fcurvalue,2)); print( "</blockquote>" ); print( "<br>" ); else print( "<i>koszyk jest pusty</i><br><br>" ); /* Tworzenie nowego obiektu ShoppingBasket. Dodanie kilku przedmiotów usunięcie kilku przedmiotów i wypisanie zawartości koszyka */ $abasket = new ShoppingBasket( 3.50 ); $abasket->printbasket(); $abasket->additem( "gizmo", 1.50 ); // dodanie 1 gizmo $abasket->printbasket(); $abasket->additem( "foobar", 2.10, 6 ); // dodanie 6 foobarów $abasket->printbasket(); $abasket->removeitem( "foobar", 15 ); $abasket->printbasket(); $abasket->removeitem( "foobar", 3 ); $abasket->printbasket();?>
Zestawy znaków i sortowanie zestaw znaków zestaw symboli i kodowania sortowanie zestaw zasad stosowanych podczas porównywania znaków w zestawie znaków MySQL wobec zestawów znaków przechowuje łańcuchy z użyciem różnych zestawów znaków porównuje łańcuchy przy użyciu różnego sortowania miesza łańcuchy o różnych zestawach znaków lub o różnym sortowaniu, na poziomie serwera, bazy danych, tabeli Obsługa znaków jak działa SHOW CHARACTER SET lista obsługiwanych zestawów Charset Description Default collation hp8 HP West European hp8_englis_ci
Porządki sortowania każdy zestaw znaków ma przynajmniej 1 sortowanie SHOW COLLATION porządki sortowania dla zestawu przykład: SHOW COLLATION LIKE latin1% ; Collation Charset Id Default Compiled Sotrlen Latin1_swedish_ci Latin1 8 Yes Yes 1 jeśli tworząc tabelę nie określono zestawu znaków i sortowania dla tej tabeli jest użyty porządek dla bazy danych domyślnej: character_set_database, collation_database jeśli brak bazy domyślnej jak parametry ustawione dla serwera: character_set_server i collation_server.
Zestaw znaków i sortowanie dla tabeli każda tabela ma swój zestaw znaków i sortowanie CREATE TABLE, ALTER TABLE pozwalająokreślić zestaw znaków i sortowanie CREATE TABLE nazwa_tabeli (lista kolumn) DEFAULT CHARACTER SET nazwa_zestawu COLLATE nazwa_sortowanie ALTER TABLE nazwa_tabeli (lista kolumn) DEFAULT CHARACTER SET nazwa_zestawu COLLATE nazwa_sortowanie jeśli określono CHARACTER SET X i COLLATE Y działa zgodnie z wyborem jeśli jest CHARACTER SET X i brak COLLATE, to zestaw wybrany obowiązuje, sortowanie domyślne jeśli nic nie określono to domyślne ustawienia bazy domyślnej, bądź serwera
Zestaw znaków i sortowanie dla kolumny każda kolumna znakowa: CHAR, VARCHAR, TEXT ma swój zestaw znaków i sortowanie w CREATE TABLE, ALTER TABLE można określić zestaw znaków i sortowanie CREATE TABLE Table1 ( column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german_ci; ); jeśli określono CHARACTER SET X i COLLATE Y działa zgodnie z wyborem jeśli jest CHARACTER SET X i brak COLLATE, to zestaw wybrany obowiązuje, sortowanie domyślne jeśli nic nie określono to przenoszą się ustawienia z tabeli, do której kolumna przynależy.
Przykłady CREATE TABLE t1 ( c1 CHAR(10) CHARACTER SET latin1 COLLATE latin_german_c1 ) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin; CREATE TABLE t1 ( c1 CHAR(10) CHARACTER SET latin1 ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci; CREATE TABLE t1 ( c1 CHAR(10) ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci; CREATE DATABASE d1 DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci; USE d1; CREATE TABLE t1 ( c1 CHAR(10) );
Zestawy znaków i sortowanie dla połączenia (1) Jaki zestaw znaków ma zapytanie wychodzące od klienta? - zmienna character_set_client ustala taki zestaw Na jaki zestaw znaków serwer powinien przetłumaczyć zapytanie po jego odebraniu? - zmienne character_set_connection i collation_connection mówią jak przekształcą się zapytania klienta, collation_connection szczególnie ważna do porównywania łańcucha znaków Na jaki zestaw znaków powinien przetłumaczyć serwer zbiory wynikowe lub komunikaty o błędzie? - zmienna character_set_results definiuje zestaw znaków: dane wynikowe wartości kolumn, a także nazwy kolumn Zmienne opisywane powyżej są ustawialne: SET NAMES x wszystko od klienta przychodzące będzie w x SET character_set_client = x; SET character_set_results = x; SET character_set_connection = x; Domyślnie: collation_connection = x;
Zestawy znaków i sortowanie dla połączenia (2) SET CHARACTER SET x jest równoważne zestawowi operacji: SET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database; Domyślnie: collation_connection = x; dla klienta mysql nie trzeba ustawiać SET NAMES przy każdym uruchomieniu, wystarczy w wierszu instrukcji podać: --default-character-set=koir8r Serwer nie będzie wykonywał żadnych konwersji gdy: SET character_set_results = NULL;
Zestawy znaków i sortowanie dla łańcucha znaków (1) SELECT łańcuch SELECT _latin1 łańcuch ; SELECT _latin1 łańcuch COLLATE latin1_danish_ci; w pierwszej odsłonie zestaw znaków i sortowanie określono w zmiennych systemowych: character_set_conection i collation_connection nazwa zestawu znaków to introduktor, który zawiadamia serwer że docierający łańcuch jest w zestawie x można umieścić introduktor przed literałem szestnastkowym i? substytutem parametrów: SELECT _latin1 x AABBCC SELECT _latin1 0xAABBCC; SELECT _latin1?:
Zestawy znaków i sortowanie dla łańcucha znaków (2) select k from t1 order by k collate latin1_german2_ci select k collate latin1_german2_ci as k1 from t1 order by k1; select k from t1 group by k collate latin1_german2_ci; select max(k collate latin1_german2_ci) from t1; select distinct k collate latin1_german2_ci from t1; select * from t1 group by k having k = _latin1 Müller collate latin1_german2_ci; select * from t1 where _latin1 Müller collate latin1_german2_ci like k;
Zestawy znaków i sortowanie dla łańcucha znaków (3) x y COLLATE z równoważne x (y COLLATE z) wysoki priorytet COLLATE wyższy niż operator BINARY to skrót dla COLLATE gdyż BINARY x równoważne jest x COLLATE y przy założeniu, że y to nazwa binarnego porządku sortowania dla zestawu x, każdy zestaw ma binarny porządek sortowania: SELECT * FROM t1 ORDER BY BINARY a; SELECT * FROM t1 ORDER BY a COLLATE latin1_bin; Operacje na które ma wpływ obsługa znaków (1) odrębnie rozważa się funkcje które na wejściu i wyjściu mają jeden i ten sam łańcuch, i kleją wiele łańcuchów
Operacje na które ma wpływ obsługa znaków (2) INSTR(), LCASE(), LOWER(), LTRIM(), REPLACE(), MID(), REVERSE(), RIGHT(), RPAD(), RTRIM(), SOUNDEX(), UPPER() jednołańcuchowe jeśli jest COLLATE x użyć sortowania COLLATE x jeśli są dwie konstrukcje COLLATE x i COLLATE y błąd CONVERT(), CAST() przekształcanie danych między różnymi zestawami znaków CONVERT (wyrażenie USING nazwa_transkodowania) SELECT CONVERT (polelatin1 USING utf8) FROM tabelalatin1; CAST (łańcuch_znaków AS typ_danych_znakowych CHARACTER SET nazwa_zestawu_znaków) SELECT CAST (_latin1 test AS CHAR CHARACTER SET utf8);
Obsługa Unicode zestaw znaków Unicode UCS-2 binarna reprezentacja danych każdy znak to kod dwubajtowy, najbardziej znaczący jako pierwszy litera A ma kod 0x0041 i jest pamiętana jako: 0x00 0x41 litera ы ma kod 0x044B i jest pamiętana jako 0x04 0x4B nie działa jako zestaw klienta SET NAMES ucs2 nie działa zestaw znaków Unicode UTF8 sekwencje bajtowe mają różne długości litery łacińskie, cyfry, znaki przestankowe to jeden bajt, większość europejskich i bliskowschodnich liter mieści w sekwencji dwubajtowej, alfabety dalekowschodnie to sekwencje trzybajtowe sekwencje czterobajtowe nie są obsługiwane UTF8 jest stosowany do pamiętania metadanych USER(), CURRENT_USER(), VERSION() mają domyślny zestaw UTF8