PHP Wiesaw Piasecki Literatura Davey Shafik Ben Ramsey
PHP Wiesław Piasecki
Literatura • Davey Shafik, Ben Ramsey: Zend PHP 5 Certification Study Guide; • W. Jason Gilmore : Beginning PHP and My. SQL 5: From Novice to Professional, Second Edition (Paperback) ; • Edward Lecky-Thompson, Heow Eide-Goodman, Steven D. Nowicki, Alec Cove: PHP 5. Zaawansowane programowanie • Dokumentacja PHP 5 www. php. net ; • Dokumentacja Oracle Database Express Edition http: //www. oracle. com/pls/xe 102/homepage; • Oracle Database Express Edition 2 Day Plus PHP Developer Guide. pdf http: //www. oracle. com/technology/tech/php/pdf/xe_php devguide. pdf; ©Wiesław Piasecki 2007 2
PHP • PHP (PHP: Hypertext Preprocessor) refleksyjny skryptowy język programowania zaprojektowany do generowania dynamicznych stron internetowych. • Składnia opiera się na językach: C, Java i Perl • Wspiera model obiektowy od wersji PHP 5 • Obecna, stabilna wersja to 5. 2. 3 ©Wiesław Piasecki 2007 3
Tagi PHP • Standardowy: <? php …. Kod ? > – Najlepsze rozwiązanie pod względem przenoszalności jak i wstecznej zgodności • Skrócony: <? … kod ? > <? =$variable; ? > – Konflikt z nagłówkami XML – Możliwość bezpośredniego wyświetlenia wyniku wyrażenia do wyjścia skryptu • Skryptowy: <script language=”php”> …kod </script> • ASP <% …kod %> ©Wiesław Piasecki 2007 4
Komentarze • Jednoliniowe: – // komentarz jednoliniowy – # komentarz jednoliniowy • Wieloliniowe: /* komentarz wieloliniowy */ • Dokumentacji: /** * Dokumentacja API *@param string $name */ function set. Name($name); ©Wiesław Piasecki 2007 5
Typy danych (1) • Skalarne: – boolean – Numeryczne: • int • float – string (zbiór danych binarnych reprezentujących np. tekst, zdjęcie, muzykę itd. ) ©Wiesław Piasecki 2007 6
Typy danych(2) • Złożone: – Array (kontener na uporządkowany zbiór elementów; w PHP niekoniecznie tego samego typu) – Object (kontener na dane, jak i kod programu) • Inne – null- oznacza zmienną, której nie przyporządkowano żadnej wartości – resource – służy do określenia zewnętrznych źródeł danych w operacjach, które nie należą do typowych zadań PHP np. obsługa plików. ©Wiesław Piasecki 2007 7
Zmienne • Zmienna jest tymczasowym kontenerem przechowującym wartość lub wartości • W PHP zmienna nie ma ściśle zdefiniowanego typu, tak jak to jest choćby w C czy Javie np. zmienna identyfikowana przez nazwę, którą poprzedza znak $ np. $variable=3 • W nazwę zmiennej mogą stanowi litery (a-z), (A-Z) oraz cyfry i znak podkreślenia. Cyfra nie może rozpoczynać nazwy zmiennej! • PHP rozróżnia wielkie i małe litery: $tr i $Tr to nie jest ta sama zmienna! • Może przyjmować dowolną wartość dowolnego typu np. $str='studia'; $str=3; ©Wiesław Piasecki 2007 8
Zmienna zmiennych • Zmienna zmiennych jest zmienną, której nazwa jest przechowywana w innej zmiennej. • Przykład $name = 'foo'; $$name = 'bar'; echo $foo; //wyświetli 'bar' Uwaga! Zmienna zmiennych jest potężnym narzędziem, ale należy używać go z rozwagą. Ponieważ nieprawidłowe jego użycie może doprowadzi do trudności w zrozumieniu i dokumentowaniu kodu, a także do poważnych problemów z zapewnieniem bezpieczeństwa całej aplikacji. ©Wiesław Piasecki 2007 9
Przechowywanie nazwy funkcji w zmiennej • Przykład: function my_function(){ echo 'my_function!'; } $f = 'my_function'; $f(); //wywoła funkcję my_function Uwagi takie same jak przy wykorzystaniu techniki zmienna zmiennej ©Wiesław Piasecki 2007 10
Czy dana zmienna istnieje? • Sprawdzenie czy dana zmienna istnieje można dokonać za pomocą funkcji isset() • isset($var) zwróci wartość równą true jeśli zmienna $var istnieje i jej wartość jest różna od NULL, w przeciwnym wypadku zwróci wartość równą false Przykład Jaka wartość zostanie wyświetlona? $name='name'; $$name=null; If( isset($name))echo '1'; else echo '2'; //it returns 2 ©Wiesław Piasecki 2007 11
Stałe • • Stałe definiują niezmienne wartości. Są dostępne dla dowolnego zakresu Mogą zawierać tylko skalarne wartości Wymagania dotyczące nazewnictwa są takie same jak dla zmiennych oprócz konieczności umieszczania znaku $ przed nazwą stałej. Przykład: define ('EMAIL', head_desk@java. sun. com); echo EMAIL; ©Wiesław Piasecki 2007 12
Operatory • • • Operator przypisania: = Operatory arytmetyczne: +, -, *, / Operatory łańcuchowe : . Operatory porównania Operatory logiczne Operatory bitowe Kontroli błędów Wykonania poleceń systemowych Inkrementacji, dekrementacji wartości liczbowych Operatory identyfikujące obiekty ©Wiesław Piasecki 2007 13
Operatory przypisania • Do przypisania zmiennej wartości służy operator: = np. $a=4; $a='study'; $b=$a; $a+=3; • Do przypisania zmiennej referencji służy operator &. – Zmienne referencyjne działają podobnie jak w C Przykład: $a = 10; $b = &$a; $a=10; $b = 20; $b=$a; echo $a; // 20 $b=20; Operator przypisania wartość działa dla wszystkich typów z echoprzez $a; //10 wyjątkiem obiektów, które zawsze są przekazywane przez referencje! ©Wiesław Piasecki 2007 14
Operatory arytmetyczne • Dodawanie : $x = $x + 2; • Odejmowani : $x = 4 – 1; • Mnożenie: $x = $x * 2; • Dzielenie: $x = $x / 12; • Modulo: $x = $x % 3; • Inkrementacji i dekrementacji : $a++, ++$a, $a--, --$a Ćwiczenie Jaki rezultat zostanie wyświetlony? $a=3; $t='text'; echo $a++; //$a=3 echo ++$a; //$a=5 echo --$a; //$a=4 echo $a--; //$a=4 echo ++$t; // 1 - string text najpierw zostanie skonwertowany na liczbę 0, // a dopiero później zostanie on zwiększony o jeden i wyświetlony ©Wiesław Piasecki 2007 15
Konkatenacja łańcuchów • Do konkatenacji służy operator : '. ' (kropka) • Umożliwia on łączenie łańcuchów znakowych, zmiennych ze sobą; Przykłady: $str='boot'. 'able'; // $str zawiera teraz //wartość 'bootable' $str 1= ' disc'; $str. = $str 1; echo $str; // bootable disc ©Wiesław Piasecki 2007 16
Operatory porównania (1) • Operator równości: == – Zwraca true jeśli dwa operandy są równe tzn. że mogą by skonwertowane do typu prostego w którym posiadają takie same wartości, ale nie koniecznie muszą być tego samego typu • Operator identyczności: === – Zwraca true tylko wtedy jeśli operandy są tego samego typu i posiadają taką samą wartość • Operator różności : != • Operator nieidentyczności : !== ©Wiesław Piasecki 2007 17
Operatory porównania (2) • Mniejszości : • Większości : <, <= >, >= Ćwiczenie: Jaki wynik zostanie wyświetlony na ekranie? $str 1 = 'ABC'; $str 2 = 'ABD'; echo (int) ($str 1>$str 2); // 0 ©Wiesław Piasecki 2007 18
Operatory bitowe • • AND: OR: XOR: NOT: & I ^ ~ • Przesunięcie bitowe w lewo: • Przesunięcie bitowe w prawo: Przykład: $x=0; echo ~$x; //-1 << >> $a=1; echo $a << 3; // 8 echo $a >> 2; // 0 ©Wiesław Piasecki 2007 19
Operatory logiczne • AND logiczny : && / and • OR logiczny: II / or • XOR logiczny: XOR • NOT logiczny: ! Przykład: $a = true; $b=false; echo (int) ($a && $b) XOR ($a or $b); // 1 Przy wykonywaniu operacji logicznej AND najpierw sprawdzana jest lewa strona operandu i jeśli jest równa false, wtedy całe wyrażenie od razu przyjmuje wartość false (prawa strona operandu nie jest w ogóle obliczana – co przyspiesza wykonywaniu operacji logicznych i umożliwia wykonanie pewnych operacji w zależności od powodzenia innych ) ©Wiesław Piasecki 2007 20
Inne operatory • Operator tłumienia błędów : @ – Powoduje, iż PHP ignoruje prawie wszystkie błędy podczas gdy dane wyrażenie jest obliczane np. $con=@mysgl_connect(); • Backtick operator : ‘ – Umożliwia wykonanie poleceń powłoki wraz z odbiorem ich wyjścia np. $a= ‘ls -l‘ wynik UNIX-owgo polecenia ls będzie zapisany w zmiennej $a ©Wiesław Piasecki 2007 21
Instrukcje sterujące • Instrukcje warunkowe: – if – switch • Pętle – while – do while – for ©Wiesław Piasecki 2007 22
Instrukcje warunkowe • Mogą być zagłębiane wielokrotnie • Warunki w instrukcjach warunkowych muszą być logiczne. • Instrukcja if if (warunek 1){instr 1 } else if (warunek 2){instr 2 } else { instr 3 } • Operator trójskładnikowy –umożliwia osadzenie operacji if then else wewnątrz wyrażenia np. echo 10==$x ? 'Yes' : 'No'; ©Wiesław Piasecki 2007 23
Instrukcje warunkowe(2) • Instrukcja switch(wyrażenie){ case val 1: instr. 1; break; case val 2: instr. 2; break; default: instr_default; break; } Wyrażenie jest obliczane tylko jeden raz. Jest ono porównywane z wartościami znajdującymi się po słowie kluczowym case. Jeśli porównanie zwraca wartość true to wykonywane są instrukcję znajdujące się : aż do instrukcji break, która powoduje wyjście programu z pętli, operacji switch. Ćwiczenie Zaproponuj kod programu, który obliczy n! dla 0<=n<11 z wykorzystaniem instrukcji switch. ©Wiesław Piasecki 2007 24
Ćwiczenie na switch • $n=7; $silnia=1; Switch($n){ case 10: $silnia*=10; case 9: $silnia*=9; case 8: $silnia*=8; case 7: $silnia*=7; case 6: $silnia*=6; case 5: $silnia*=5; case 4: $silnia*=4; case 3: $silnia*=3; case 2: $silnia*=2; } echo $silnia; ©Wiesław Piasecki 2007 25
Instrukcje pętli - while • Budowa instrukcji while: while (warunek){ Instrukcje; } • Instrukcje są wykonywane tylko wtedy, gdy warunek jest prawdziwy • Zawsze najpierw sprawdzany jest warunek, a dopiero potem wykonywane są instrukcje • Instrukcje mogą być wykonane zero lub wiele razy Przykład: $i=0; while($i<10){ echo $i. $PHP_EOL; $i++; } ©Wiesław Piasecki 2007 26
Instrukcje pętli - do while • Budowa instrukcji do while: do { Instrukcje; }while(warunek) • Najpierw wykonywane są instrukcje, a dopiero potem sprawdzany jest warunek, jeśli jest on prawdziwy następuje kolejny obieg pętli, jeśli nie - program wychodzi z pętli. • Instrukcje zostaną wykonane co najmniej jeden raz. Przykład: $i=0; do{ echo $i. $PHP_EOL; $i++; } while($i<10); ©Wiesław Piasecki 2007 27
Instrukcja pętli - for • Składnia instrukcji for: for(expr 1; expr 2; expr 3) { instrukcje; } • expr 1 jest obliczane tylko jeden raz na początku działania pętli • expr 2 jest obliczane na początku każdej iteracji pętli jeśli zwraca ono wartość true, wtedy obieg pętli jest kontynuowany i wykonywane są instrukcje; w przeciwnym wypadku wykonanie instrukcji pętli kończy się • expr 3 jest obliczane na zakończenie każdej iteracji pętli ©Wiesław Piasecki 2007 28
Instrukcje sterujące pętlami(1) • Do zatrzymania wykonywania instrukcji pętli służy instrukcja break (int_param); • int_param- jest opcjonalnym parametrem typu całkowitego, który umożliwia wyjście z wielokrotnie zagnieżdżonych pętli (z tylu ile wynosi parametr int_param) Ćwiczenie: Co wyświetli się na ekranie? For($i=0; $i<10; $i++){ For($j=1; $j<3; $j++){ echo('i='. $i. ' j='. $j); If(($i+$j)% 5 ==0) break 2; }} Zawsze należy zwracać uwagę czy instrukcja break kończy się średnikiem. Jeśli go nie ma, a po słowie break znajduje się wyrażenie zwracające liczbę wtedy to pojawia się bardzo trudny i nie łatwy do wychwycenia błąd! ©Wiesław Piasecki 2007 29
Instrukcje sterujące pętlami(2) • Do przeskakiwania do następnej iteracji pętli służy słowo kluczowe continue; Przykład: For($i = 0; $i <10; $i++){ if($i >3 && $i < 6) continue; echo $i. $PHP_EOL; } //1236789 ©Wiesław Piasecki 2007 30
Błędy i ich obsługa • Typy błędów: – Błędy kompilacji – wyłapywane przez kompilator podczas kompilacji skryptu. Nie mogą być wychwycone przez sam skrypt. – Błędy krytyczne – powodują zatrzymanie wykonania skryptu; Nie mogą być wychwycone. – Błędy oddzyskiwalne – reprezentują ważne niepowodzenia, ale mogą być obsłużone w bezpieczny sposób. – Ostrzeżenia – reprezentują błędy podczas wykonania skryptu. Nie zatrzymują wykonania skryptu. – Uwagi – informują o zaistnieniu sytuacji w której mógł wystąpić mało znaczący błąd. Nie powodują zatrzymania wykonania skryptu. ©Wiesław Piasecki 2007 31
Raportowanie błędów • Poziom raportowania błędów można ustawić w pliku: php. ini za pomocą zmiennych: – error_reporting – określa jakie błędy będą raportowane przez PHP – display_errors – gdy ta opcja jest włączona błędy wyświetlane są na wyjściu skryptu – log_errors – gdy ta opcja jest włączona błędy są zapisywane w pliku błędów na serwerze web • Raportowanie błędów może by dynamicznie zmieniane z wnętrza skryptu poprzez wywołanie funkcji error_reporting ©Wiesław Piasecki 2007 32
Obsługa błędów • Do obsługi błędów służy funkcja set_error_handler(), która wychwytuje wszystkie błędy • Umożliwia ona zbudowanie hierarchicznej struktury funkcji do obsługi błędów • Jej użycie wymusza konieczność zdublowania mechanizmów obsługi błędów PHP: obsługi wszystkich błędów oraz zatrzymania wykonania skryptu w razie konieczności. ©Wiesław Piasecki 2007 33
Funkcje • Funkcja – jest to wydzielona część programu wykonująca pewne operacje. Umożliwia ona powtórne wykorzystanie kodu, zwiększenie przejrzystości programu, jak i zmniejszenie liczby błędów. • W nazwach funkcji nie są rozróżnialne wielkie i małe litery. • Ograniczenia nazewnictwa są podobne jak dla zmiennych: (a-z), (A-Z), _, (0 -9), nazwa funkcji nie może rozpoczynać się od cyfry. ©Wiesław Piasecki 2007 34
Definicja funkcji • Definicja funkcji: function name($arg 1, $arg 2, …){ Instrukcje; return $return_value; } • name – określa nazwę funkcji • Listę argumentów funkcji stanowią zmienne: $arg 1, $arg 2, … • Instrukcje stanowią operacje wykonywane przez daną funkcję • Funkcja może zwracać wartość(ci)– do czego służy słowo kluczowe return po którym podana jest zwracana wartość; return może też służyć do wcześniejszego wyjścia programu z funkcji. • Funkcja może też zwracać referencje do zmiennych ©Wiesław Piasecki 2007 35
Przykłady definicji funkcji(1) • Bez zwracania wartości; function hello($name){ echo 'hello'. $name; } • Ze zwracaną wartością: function kwadrat($a){ //$a jest argumentem funkcji echo 'Hallo world!'. $PHP_EOL; return $a*$a; //zwrócenie wartości } ©Wiesław Piasecki 2007 36
Przykłady definicji funkcji(2) • Ze zwracaną referencją: function &query($sql){ $result = mysql_result($sql); Return $result; } – Błędna referencja function &blad(){ return 'blędna referencja'; } Uwaga! Referencja może być tylko do zmiennej. Nie może dotyczyć wyrażenia, ani też null (samo słowo return) ©Wiesław Piasecki 2007 37
Zakres zmiennych • PHP ma trzy zakresy widoczności zmiennych: – Globalny – zmienne są dostępny we wszystkich częściach skryptu; posiadają go zmienne, które zostały zdefiniowane poza funkcjami i klasami – Funkcji – zmienne są dostępne w obrębie funkcji, w której zostały zdefiniowane – Klasy – zmienne są dostępne w obrębie klasy; szczegóły będą omówione podczas zajęć programowania zorientowanego obiektowo w PHP ©Wiesław Piasecki 2007 38
Przykład $a='Hello world'; Function hello(){ $a='Hello Reader'; $b='Hello'; } hello(); Echo $a; //Hello world Echo $b; // warning $b isn't set ©Wiesław Piasecki 2007 39
Dostęp do zmiennych globalnych(1) • Problem: function test(){echo 'i='. $i; } $i=4; test(); // zostanie wyświetlone tylko i= • Sposób I Dostęp do zmiennych globalnych umożliwia instrukcja global, która poprzedza listę zmiennych globalnych, które chce się zaimportować do funkcji function test(){global $i; echo 'i='. $i; } $i=4; test(); // zostanie wyświetlone i=4 ©Wiesław Piasecki 2007 40
Dostęp do zmiennych globalnych(2) • Sposób II Dostęp do zmiennych globalnych umożliwia superglobalna tablica $GLOBALS, ktora zawiera wszystkie zmienne globalene. Przykład: function test(){ echo 'i='. $GLOBALS['i']; } $i=4; test(); // zostanie wyświetlone i=4 ©Wiesław Piasecki 2007 41
Przekazywanie argumentów • Liczba argumentów w wywołaniu funkcji może być mniejsza równa od ilości argumentów w definicji funkcji • Wartości domyślne muszą zajmować skrajnie prawe elementy listy argumentów • Wartościami domyślnymi mogą być tylko proste wartości (nie mogą być to wyrażenia) Przykład: function f($required , $optional = ”null”){ } ©Wiesław Piasecki 2007 42
Listy argumentów o zmiennej długości(1) • Oparte na koncepcji tablicy argumentów argv i liczbie argumentów argc z języka C • Do operacji na liście argumentów o zmiennej długości wykorzystuje się trzy funkcje: – func_num_args() – zwraca całkowitą liczbę argumentów przekazanej do danej funkcji – func_get_args() – zwraca listę argumentów – func_get_arg($n) – zwraca wartość argumentu o indeksie $n w tablicy • Lista argumentów o zmiennej długości jest potężnym narzędziem ale należy pamiętać, że może stać się ona źródłem wielu błędów. ©Wiesław Piasecki 2007 43
Listy argumentów o zmiennej długości(2) Przykład: function display_args($arg 1){ if(func_num_args()==0) die('You need to specify at least one argument'); else{ $args=func_get_args(); foreach($args as $arg) echo $arg. "n"; } } display_args('c: Windows', 'test', 5); ©Wiesław Piasecki 2007 44
Tablice • Tablica jest uporządkowaną kolekcją elementów • Każdy element posiada wartość i jest identyfikowany przez unikalny indeks w obrębie danej tablicy • Indeksem tablicy mogą być liczby całkowite, albo dowolne łańcuchy znakowe ©Wiesław Piasecki 2007 45
Tworzenie tablic(1) • Sposób I – poprzez wywołanie funkcji array() Przykład: $a = array(10, 20, 30); //tablica indeksowana od 0 $a = array('a'=>10, 'b'=>20, 'c'=>30); //tab asocjacyjna $a = array(3=>10, 2=> 'tekst', 1=>0); //tab asocjacyjna $a = array(); //pusta tablica ©Wiesław Piasecki 2007 46
Tworzenie tablic(2) • Sposób II – poprzez dostęp do tablicy za pomocą operatora tablicowego ([]) Przykład: $x[] = 10; // x [0]=10 $x['aa'] = 11; // x ['aa']=11 $x[] =12; // x[1]=12 echo $x[1]; //11 PHP automatycznie inicjalizuje tablicę jeśli takowa nie istnieje. Operator tablicowy([]) umożliwia przyporządkowanie wartości następnemu wolnemu indeksowi całkowitoliczbowemu. ©Wiesław Piasecki 2007 47
Wyświetlanie tablic(1) • Funkcja print_r($tab) – rekursywnie wyświetla zawartość tablicy; może zwrócić zawartość tablicy w postaci łańcucha znaków • Funkcja var_dump() – wyświetla zawartość tablicy, a także typy danych każdej ze zmiennej Przykład: $a = array(3=>10, 2=>'12', 1=>0); //tab asocjacyjna print_r($a) ; //Array ( [3] => 10 [2] => 12 [1] => 0 ) var_dump($a); // array(3) { [3]=> int(10) [2]=> string(2) "12" [1]=> int(0) } ©Wiesław Piasecki 2007 48
Wyświetlanie tablic(2) • Wykorzystanie instrukcji foreach() – foreach (array_expression as $value) statement – foreach (array_expression as $key => $value) statement Przykład: $a = array(3=>10, 2=>'12', 1=>0); foreach($a as $value) echo $value. ", "; //10, 12, 0 echo "n"; foreach($a as $key=>$value) echo $key. "=>". $value. "n"; //3=>10 2=>12 1=>0 ©Wiesław Piasecki 2007 49
Tablice wielowymiarowe • Tablice wielowymiarowe tworzone są poprzez proste przydzielenie elementom tablicy ich wartości. Przykład: $array[]=array('foo', 'bar'); $array[]=array('baz', 'bat'); echo $array[0][1]. $array[1][0]. "n"; $array[2][0]='too'; echo $array[2][0]. "n"; ©Wiesław Piasecki 2007 //barbaz //too 50
Unravelling array • Do jej utworzenia wykorzystuje się konstrukcję językową list() – co powoduje rozbicie tablicy na zmienne niezależne Przykład: $info = array('coffee', 'brown', 'caffeine'); // Listing all the variables list($drink, $color, $power) = $info; echo "$drink is $color and $power makes it special. n"; list($drink)= $info; echo "$drink is great. n"; // coffee is great. ©Wiesław Piasecki 2007 51
Operacje na tablicach • Operator (+) – umożliwia łączenie tablic (wynikowa tablica zawiera wszystkie elementy składowe tablicy) Przykład: $a = array(1, 2, 3); $b = array('a'=>1, 'b'=>2, 3); var_dump($a+$b); //array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) ["a"]=> int(1) ["b"]=> int(2) } Uwaga! Jeśli istnieją elementy o tych samych indeksach w obydwu tablicach to w wynikowej tablicy pojawi się tylko jeden z nich. ©Wiesław Piasecki 2007 52
Porównywanie tablic • Operator porównania(==) zwraca wartość równą true, gdy spełnione są wszystkie z podanych warunków : – Dwie tablice mają taką samo liczbę elementów – Elementy w obydwu tablicach mają te same klucze i wartości bez względu na kolejność ich występowania • Operator identyczności (===) zwraca true tylko wtedy, gdy obie tablice zawierają te same klucze/wartości w tej samej kolejności ©Wiesław Piasecki 2007 53
Porównywanie tablic przykład $a = array(1, 2, 3); $b = array(1=>2, 2=>3, 0=>1); $c = array('a'=>1, 'b'=>2, 'c'=>3); var_dump($a==$b); //True var_dump($a===$b); //False var_dump($a==$c); //False var_dump($a===$c); //False ©Wiesław Piasecki 2007 54
Zliczanie elementów • Funkcja count ($mix) służy do określenia rozmiaru tablicy Przykład: $a = array(1, 2, 4); $b = array(); $c = 12; echo count($a); //3 echo count($b); //2 echo count($c); //1 Uwaga ! Do sprawdzenia czy dana zmienna jest tablicą należy użyć funkcji is_array() a nie posługiwać się funkcją count(), która dla skalarnej wartości zwraca wartość równą 1. ©Wiesław Piasecki 2007 55
Jak sprawdzić czy dany klucz istnieje w tablicy? • Użyć funkcji isset() Przykład: $a = array('a'=>1, 'b'=>2, 'd'=>null); echo isset($a['a']); //True echo isset($a['c']); //False echo isset($a['d']); //False? Uwaga! Funkcja isset() zwraca true jeśli istnieje dana zmienna a jej wartość jest różna od null. • Najlepszym rozwiązaniem jest użycie funkcji array_key_exists($key, $array). echo array_key_exists('d', $a); //True ©Wiesław Piasecki 2007 56
Czy dany element istnieje w tablicy? • Do sprawdzenia czy dany element o konkretnej wartości istniej w tablicy wykorzystuje się funkcję in_array($value, $array, …) Przykład: $a = array(1=>null, 'a'=>2); echo in_array(2, $a); //True • Do usunięcie elementu wykorzystuję się funkcję unset(). unset($a['a']); echo in_array(2, $a); //False ©Wiesław Piasecki 2007 57
Odwracanie porządku tablicy • Do odwracania kolejności elementów tablicy służy funkcja array_reverse() a = array('x'=>'a', 5=>'b', 'c'); var_dump(array_reverse($a)); //array(3) { [0]=> string(1) "c" [1]=> string(1) "b" ["x"]=> string(1) "a" } Uwaga! Podczas odwracania kolejności elementów w tablicy powiązanie kluczy wartość jest tracone tylko dla tych elementów, których klucze są liczbami. • Do zamiany wartości każdego elementu tablicy z jego kluczem służy funkcja array_flip() $a = array('a', 'b', 'c'); var_dump(array_flip($a)); //array(3) { ["a"]=> int(0) ["b"]=> int(1) ["c"]=> int(2) } ©Wiesław Piasecki 2007 58
Iteracje tablic • Iteracja tablic jest ważną i bardzo często wykonywaną czynnością • W większości przypadków nie może być dokonana tak jak w innych językach programowania ze względu na: – Nieciągłość kluczy – Typ danych kluczy (String), który nie jest typem porządkowym Przykład: $a = array('x'=>'a', 5=>'b'); ©Wiesław Piasecki 2007 59
Wskaźnik tablicy • Wskaźnik tablicy (ang. array pointer) wskazuję na bieżący element tablicy • Umożliwia iterację tablicy • Dostęp do niego jest możliwy za pomocą wbudowanego zestawu funkcji: – – – reset() – zeruje wskaźnik to jego początkowej pozycji end() – ustawia wskaźnik na ostatnim elemencie tablicy next() – przesunięcie wskaźnika do następnego elementu prev() – przesunięcie wskaźnika do poprzedniego elementu current() – zwraca wartość obecnego elementu key() – zwraca wartość klucza obecnego elementu ©Wiesław Piasecki 2007 60
Wskaźnik tablicy - przykład $a = array('x'=>'a', 5=>'b', 0=>'c'); function display. Array($a){ reset($a); while(key($a)!==null){ //dlaczego !== , a nie != ? echo key($a). "=>". current($a). "n"; next($a); } } display. Array($a); // x=>a 5=>b 6=>c ©Wiesław Piasecki 2007 61
Prostszy sposób iteracji – foreach • Konstrukcja foreach() umożliwia iterację przez wszystkie elementy tablic; zaczynając od początkowego kończąc na ostatnim – foreach (array_expression as $value) statement – foreach (array_expression as $key => $value) statement • Foreach() – zawsze zeruje wskaźnik tablicy ustawiając go na pierwszym elemencie • Foreach() – działa na kopii tablicy – zmiany dokonane w pętli nie będą widoczne po wyjściu z niej; chyba że zastosuję się odwołanie przez referencję zamiast przez wartość (od PHP 5) ©Wiesław Piasecki 2007 62
Foreach z referencją – przykład $a = array(1, 2, 3); foreach ($a as &$elem){ $elem*=2; } unset($elem); $elem=0; var_dump($a); Jakie wartości zostaną wyświetlone na ekranie? array(3) { [0]=> int(2) [1]=> int(4) [2]=> &int(0) } Uwaga! Zawsze należy „wyzerować” zmienne referencyjne z pętli foreach po ich wykorzystaniu. ©Wiesław Piasecki 2007 63
Sortowanie tablic (1) • Istnieje cały zestaw podstawowych funkcji do sortowania: – sort(&$array, integer[optional] $sort_flags) – sortuję elementy tablicy $array rosnąco wg wartości elementów; efektywnie niszczy istniejące klucze i przenumerowuje je rozpoczynając od 0 – asort (&$array, integer[optional] $sort_flags) – działa podobnie jak sort() z tą różnicą, że pozostawia powiązania klucz element nietknięte – rsort() – działa tak jak sort(), ale sortuje w porządku malejącym – arsort() – działa tak jak asort(), ale sortuje w porządku malejącym ©Wiesław Piasecki 2007 64
Sortowanie tablic (2) • Wybór sposobu sortowania dla funkcji sort, asort, rsort, arsort dokonywany jest za pomocą drugiego, opcjonalnego parametru tych, że funkcji: – SORT_REGULAR – porównuje elementy tablicy bez dokonywania jakichkolwiek konwersji; domyślny – SORT_NUMERIC – konwertuje każdy element na liczbę w celu porównania – SORT_STRING – porównuje wszystkie elementy jako łańcuchy znakowe ©Wiesław Piasecki 2007 65
Sortowanie tablic – przykłady $a = array('a'=>3, 'b'=>2, 'c'=>1); sort($a); var_dump($a); //array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } $a = array('a'=>3, 'b'=>2, 'c'=>1); asort($a); var_dump($a); //array(3) { ["c"]=> int(1) ["b"]=> int(2) ["a"]=> int(3) } ©Wiesław Piasecki 2007 66
„Naturalne” sortowania • Cała rodzina funkcji sortujących wywodzących się od sort() porównuje bajt z bajtem co powoduje, że wynik sortowania czasami jest „nienaturalny” • Funkcja natsort() i natcasesort() – umożliwiają „naturalne” sortowanie; w przeciwności do sort() powyższe dwie funkcje utrzymują powiązania pomiędzy wartościami a kluczami tablicy. Przykład: $a = array('10 t', '1 t', '4 t'); natsort($a); var_dump($a); //array(3) { [1]=> string(2) "1 t" [2]=> string(2) "4 t" [0]=> string(3) "10 t" } ©Wiesław Piasecki 2007 67
Inne możliwości sortowania • Do sortowania wg kluczy można użyć dwóch funkcji ksort() i krsort(), których działanie jest analogiczne do funkcji sort() i rsort(). • Użytkownik może sam zdefiniować sposób sortowania poprzez zdefiniowanie funkcji porównującej. Taka funkcja może porównywać ze sobą: – wartości dwóch elementów; do sortowania należy wykorzystać funkcje usort(&$array, 'compare_method_name') bądź uasort(&$array, 'compare_method_name'). – wartości dwóch kluczy; do sortowania należy użyć metody uksort() ©Wiesław Piasecki 2007 68
Randomizacja elementów tablicy(1) • Funkcja shuffle() – umożliwia randomizacje elementów tablicy, ale niszczy powiązania pomiędzy kluczem a wartością elementu tab. Przykład: $a = array(1, 2, 3); shuffle($a); var_dump($a); //array(3) { [0]=> int(2) [1]=> int(3) [2]=> int(1) } ©Wiesław Piasecki 2007 69
Randomizacja elementów tablicy(2) • Mieszanie elementów z zachowaniem asocjacji pomiędzy kluczami a wartościami elementów Przykład: $a = array('a'=>1, 'b'=>2, 'c'=>3); $keys = array_keys($a); shuffle($keys); foreach ($keys as $v){ echo $v. "-". $a[$v]. "n"; } //c-3 b-2 a-1 • Funkcja array_keys($array) zwraca tablicę kluczy, jakie zawiera parametr funkcji ($array) ©Wiesław Piasecki 2007 70
Losowy wybór elementu z tablicy • Do losowego wyboru jednego lub większej liczby elementów służy funkcja array_rand($array, [optional]$num); - funkcja zwraca tablice wylosowanych kluczy Przykład: $a = array('a'=>1, 'b'=>2, 'c'=>3); $keys = array_rand($a, 2); var_dump($keys); //array(2) { [0]=> string(1) "c" [1]=> string(1) "a" } ©Wiesław Piasecki 2007 71
Ćwiczenie • Napisz prosty skrypt, który umożliwi kilkukrotne losowanie bez powtórzeń zadanej liczby elementów z tablicy? function array_rand 2(&$array, &$rand_keys, $num=1){ $keys = array_rand($array, $num); $n = sizeof($rand_keys); //$n – liczba elem. tablicy foreach ($keys as $key){ $rand_keys[$n++]=$key //dodanie kolejnych wylos. kluczy unset($array[$key]); //usunięcie wylosowanych elementów } } $keys 1 = array(); $keys 2 = array(); $a = array('a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5); array_rand 2($a, $keys 1, 2); // pierwsze losowanie dwóch elem. array_rand 2($a, $keys 2, 2); // drugie losowania dwóch elem. var_dump($keys 1); var_dump($keys 2); ©Wiesław Piasecki 2007 72
Tablice jako stos • PHP umożliwia wykorzystanie tablic jako stos, poprzez dwie funkcje: – array_push($stack, $mixed_value) – odkłada na stos($stack) element o wartości ($mixed_value) – array_pop($stack) – pobiera i zwraca element z wierzchołka stosu($stack) Przykład: $stack = array(); array_push($stack, 1, 2); var_dump($stack); //array(2) { [0]=> int(1) [1]=> int(2) } $value = array_pop($stack); var_dump($value, $stack); //int(2) array(1) { [0]=> int(1) } ©Wiesław Piasecki 2007 73
Tablica jako kolejka FIFO • Do pobierania elementu z początku kolejki służy funkcja array_shift() • Do dodania elementu na koniec kolejki służy funkcja array_unshift() Przykład: $stack = array('html', 'php', 'xml'); $first_elem = array_shift($stack); var_dump($stack); //array(2) { [0]=> string(3) "php" //[1]=> string(3) "xml" } array_unshift($stack, 'txt'); var_dump($stack); //array(3) { [0]=> string(3) "txt" //[1]=> string(3) "php" [2]=> string(3) "xml" } ©Wiesław Piasecki 2007 74
Tablica jako zbiór (1) • Do określenia różnicy zbiorów na podstawie wartości elementów dwóch tablic służy funkcja array_diff() Przykład: $a = array(1, 2, 3); $b = array(1, 3, 4); var_dump(array_diff($a, $b)); // array(1) { [1]=> int(2) } • Istnieją też funkcje, które obliczają różnicę zbiorów na podstawie: – Kluczy – array_diff_key() – Kluczy i wartości array_diff_assoc() – Własnych wymagań: array_diff_uassoc() i array_diff_ukey() ©Wiesław Piasecki 2007 75
Tablica jako zbiór (2) • Do określenia iloczynów zbiorów na podstawie wartości elementów dwóch tablic służy funkcja array_intersect() Przykład: $a = array(1, 2, 3); $b = array(1, 3, 4); var_dump(array_intersect($a, $b)); //array(2) { [0]=> int(1) //[2]=> int(3) } • Istnieją też funkcje, które obliczają iloczyn zbiorów na podstawie: – Kluczy – array_intersect_key() – Kluczy i wartości array_intersect_assoc() – Własnych wymagań: array_intersect_uassoc() i array_intersect_ukey() ©Wiesław Piasecki 2007 76
Łańcuchy znakowe Występują dwa rodzaje łańcuchów znakowych: – Proste łańcuchy znakowe : ' simple string ', prawie wszystkie znaki znajdujące się w nich są interpretowane jak tekst; $who= ' World ' ; echo ' Hello $who n '; // Hello $whon – Złożone łańcuchy znakowe : " complex string " • Umożliwiają podstawianie zmiennych – co powoduje wstawienie wartości zmiennej bezpośrednio do łańcucha znakowego bez konieczności wykonania dodatkowych operacji; • Umożliwiają wstawienie znaków specjalnych np. "n " $who= ' World ' ; echo "Hello $who n "; // Hello World zakończone nową linią – Heredoc syntax ©Wiesław Piasecki 2007 77
Zmienna Interpolacja? • Do enkapsulacji nazw zmiennych w łańcuchach znakowych służą nawiasy klamrowe: { } Przykład: $me = 'Dave'; $names =array('Smith', 'Johnes', 'Jackson'); echo "There cannot be more than two {$me}s!"; echo "Citation {$names[2]}[1982]"; ©Wiesław Piasecki 2007 78
Heredoc Syntax (1) • Umożliwia deklarację skomplikowanych łańcuchów znakowych • Umożliwia łatwe definiowanie łańcuchów znakowych zawierających wiele podwójnych apostrofów • Zachowuję się tak samo jak złożony łańcuch znakowy • Rozpoczyna się od specjalnego operatora <<<, bezpośrednio po którym znajduje się identyfikator; reguły nazewnictwa identyfikatora są podobne do reguł nazewnictwa zmiennych • Kończy się tym samym identyfikatorem, którym się rozpoczął; identyfikator musi znajdować się na początku nowej linii ©Wiesław Piasecki 2007 79
Heredoc Syntax (2) Przykład: echo <<<TEKST Tomek wykrzyknął: "Chodźcie tutaj!"n Wszyscy poszliśmy zobaczyć co się dzieje. TEKST //Tomek wykrzyknął: "Chodźcie tutaj!" //Wszyscy poszliśmy zobaczyć co się dzieje. ©Wiesław Piasecki 2007 80
Znaki specjalne • Backslash „” zmienia znaczenie znaku znajdującego się bezpośrednio za nim: – – – – … „n” nowa lina „t” tabulator „'” pojedynczy apostrof „\” backslash „$” symbol $ „x. FF”znak w notacji heksadecymalnej np. „x 3 a” to „: ” „377” znak w notacji ósemkowej np. „ 52” to „*” • Znaki specjalne mogą być używane w złożonych łańcuchach znakowych oraz w heredoc syntax. Tylko niektóre mogą być użyte w prostych łańcuchach znakowych np. „'”. ©Wiesław Piasecki 2007 81
Przekształcanie łańcucha znakowego • Długość łańcucha znakowego określa się za pomocą funkcji strlen() Przykład: echo strlen("Hallo World!n"); //13 Funkcja strlen() zwraca liczbę wszystkich znaków, w tym też znaków specjalnych. • Do przekształcenia jednego łańcucha znakowego w inny służy funkcja strtr(); Przykład: //Wersja dla pojedynczych znaków echo strtr('mama', 'm', 't'); //tata //Wersja dla wielu znaków echo strtr('Hallo 123', array(1=>' world', 2=>'!', 3=>"!")); //Hallo world!! ©Wiesław Piasecki 2007 82
Łańcuch znakowy jako tablica znaków • Dostęp do poszczególnych znaków jest możliwy dzięki operatorowi tablicowemu: [] • Łańcuch znakowy $s jest indeksowany od 0 do strlen($s) – 1 Przykład: $str = "Hello world!"; echo $str[1]; //e ©Wiesław Piasecki 2007 83
Porównywanie łańcuchów (1) • Do porównywania łańcuchów znakowych najlepiej wykorzystać zdefiniowane do tego funkcje: – strcmp($str 1, $str 2) – zwraca wartość równą 0, jeśli łańcuchy znakowe są takie same; bierze pod uwagę wielkości liter; – strcasecmp($str 1, $str 2) – funkcja identyczna do strcmp() z tą różnicą, że nie bierze pod uwagę wielkość liter; – substr_compare() –umożliwia porównanie podłańcucha znaków z zadanym łańcuchem; ©Wiesław Piasecki 2007 84
Porównanie łańcuchów (2) Przykład 1: $str = "Hello world"; if(strcmp($str, "hello world")===0) { echo "Equal"; }else echo "Not equal"; //Not equal Przykład 2: $str ="12 as 1"; If($str==12){ echo "Is equal"; }else echo "Is not equal"; //Is equal Uwaga: Aby uniknąć problemu związanego z konwersją należałoby użyć operatora identyczności zamiast operatora porównania. ©Wiesław Piasecki 2007 85
Proste wyszukiwanie (1) • Do szukania określonego tekstu w łańcuchu znakowym można wykorzystać dwie poniższe funkcje: – strpos($str 1, $str 2, int [optional] $start_pos) – zwraca indeks pierwszego znalezionego wystąpienia $str 2 w $str 1, rozpoczynając przeszukiwanie od pozycji $start_pos (opcja) - w przypadku gdy go nie znajdzie zwraca false; – strstr($str 1, $str 2) – zwraca cześć łańcucha $str 1 rozpoczynającą się od $str 2, jeśli takowej nie ma zwraca false; ©Wiesław Piasecki 2007 86
Proste wyszukiwanie (2) Przykład 1: $hay_stack = "123456712"; $needle = "123"; if(strpos($hay_stack, $needle)!==false){ echo "Found. "; }echo "Doesn't found. „ //Found Pytanie: Co by było gdyby zamiast !== był != ? Przykład 2: $str = "12345123"; echo strpos($str, '1', 1); // 5 ©Wiesław Piasecki 2007 87
Funkcje sprawdzające znaki z maską(1) • strspn($str, $mask, [optional] $start, [optional] $len) – zwraca długość początkowego odcinka łańcucha $str zawierającego dowolny znak wyspecyfikowany w masce $mask; opcjonalnie można wyznaczyć zakres przeszukiwanego łańcucha znakowego za pomocą $start i $len; Przykład 1: $str = "1234112 we_"; $mask = "123"; echo strspn($str, $mask, 4, 4); //3 ©Wiesław Piasecki 2007 88
Funkcje sprawdzające znaki z maską(2) • strcspn() – funkcja podobna do strspn() z tą różnicą, że zwraca długość początkowego łańcucha nie zawierającego żadnego znaku wyszczególnionego w masce; Przykład 2: $str = "aa 1234112"; $mask = "123"; echo strcspn($str, $mask, 1, 6); //1 ©Wiesław Piasecki 2007 89
Zastępowanie łańcuchów znakowych(1) • PHP oferuje kilka funkcji umożliwiających zastępowanie łańcuchów znakowych innymi łańcuchami. Są to: – str_replace($search, $replace, $str, int [optional] $count) – umożliwia zastąpienie wszystkich wystąpień $search przez $replace w łańcuchu znakowych $str; (opcjonalnie zmienna $count zwraca liczb zamian jakie zostały dokonane) Przykłady: echo str_replace('kot', 'ps', 'Ala ma kota'); //Ala ma psa //Zamiana dwóch łańcuchów w tym samym czasie echo str_replace(array('Ala', 'kot'), array('Tomek', 'ps'), 'Ala ma kota'); //Tomek ma psa ©Wiesław Piasecki 2007 90
Zastępowanie łańcuchów znakowych(2) – str_ireplace() – odmiana str_replace () nie biorąca pod uwagę wielkości liter; Przykład: $counter=0; echo str_ireplace('M', 't', 'mama', $counter); //tata echo $counter; //2 – substr_replace($str, $replace, $start, [optional]$length) – umożliwia zamianę tekstu od indeksu $start (opcjonalnie długości $length) na $replace w łańcuchu $str; Przykład: echo substr_replace('Ala ma kota', 'szarego ', 7, 0); //Ala ma szarego kota ©Wiesław Piasecki 2007 91
Przykład zastosowania funkcji obsługujących łańcuchy znakowe Jak wydobyć nazwę użytkownika z adresu email? Przykład: $mail = "jan. Kowalski@onet. pl"; echo substr_replace($mail, "", strpos($mail, '@')); //jan. Kowalski ©Wiesław Piasecki 2007 92
Wydobywanie podłańcucha • Do wyciągnięcia podłańcucha z duże łańcucha znakowego służy funkcja: – substr($str, $start, [optional] $length) – zwraca cześć łańcucha $str od pozycji $start (i opcjonalnie długości $length); pozycja $start może być ujemna wtedy liczy się ją od końca łańcucha; Przykłady: $str = "1234567"; echo substr($str, 2); //34567 echo substr($str, 3, 2); //45 echo substr($str, -3); //567 echo substr($str, -3, 2); //56 ©Wiesław Piasecki 2007 93
Formatowanie łańcuchów • PHP dostarcza wielu funkcji służących do formatowania: liczb, łańcuchów znakowych, walut, czasu itd. • Zasady formatowania są czasami zapisywane w ustawieniach lokalnych (ang. locale) • Do zmiany ustawień lokalnych używa się funkcji setlocale ($category, $locale) Przykład zmiany standardu wyświetlania walut na amerykański: setlocale(LC_MONETARY, 'en_US'); ©Wiesław Piasecki 2007 94
Formatowanie liczb • Do formatowania liczb wykorzystuje się funkcję number_format(). Może ona zawierać: – Jeden parametr – dana liczba zostanie zaokrąglona do najbliższej liczby całkowitej; kropka jako separatora tysięcy; np. echo number_format(1234. 4); //1, 234 – Dwa parametry – dana liczba zostanie zaokrąglona do tylu miejsc po przecinku ile wynosi wartość drugiego parametru; np. echo number_format(1234. 49, 1); //1, 234. 5 – Cztery parametry – dwa pierwsze parametry są interpretowane tak, jak miało to miejsce dla funkcji tylko z dwoma parametrami; trzeci oznacza separator części ułamkowej, natomiast czwarty separator tysięcy; np. echo number_format(1234. 41, 1, ', ', ' '); //1 234, 4 • Funkcja number_format() działa niezależnie od wartości ustawień lokalnych (locale). ©Wiesław Piasecki 2007 95
Formatowanie walut • Dokonuje się za pomocą funkcji money_format ($format, $sum) - $format określa zasady formatowania liczby $sum jako waluty; rodzaj waluty jest ustalany w ustawieniach lokalnych (locale); Przykład: setlocale(LC_MONETARY, 'en_US'); money_format("%. 2 n", 1000. 23); • Funkcja niedostępna pod Windows i niektórymi Unixami! ©Wiesław Piasecki 2007 96
Formatowanie łańcuchów znakowych • Zamiast wykorzystywania typowych funkcji do formatowania liczb, walut można użyć rodziny funkcji printf() do której należą: – printf() – wyświetla sformatowany łańcuch znakowy na standardowym wyjściu skryptu – sprintf() – zwraca sformatowany łańcuch znakowy – fprintf() – zapisuje sformatowany łańcuch znakowy w pliku • Wszystkie powyższe funkcje korzystają z zestawu specjalnych znaków formatujących. ©Wiesław Piasecki 2007 97
Znaki formatujące (1) • Znak formatujący zawsze poprzedzony jest przez znak specjalny „%”; • Pomiędzy „%” a znakiem określającym typ formatowania mogą znajdować się opcjonalne modyfikatory: – Specyfikator znaku („+” lub „-”) – określa sposób wyświetlania liczb ze znakiem – Specyfikator wypełnienia – określa jaki znak powinien być użyty w celu wypełnienia wolnego miejsca w łańcuchu o żądanej długości – Specyfikator wyrównania – określa czy wyjście powinno mieć lewą czy prawą orientację – Liczbowy specyfikator szerokości – określa minimalną szerokość wyjścia – Specyfikator dokładności – wskazuje ile liczb po przecinku powinno zostać wyświetlone dla liczby zmiennoprzecinkowej • stąd też aby wyświetlić „%” należy użyć „%%” ©Wiesław Piasecki 2007 98
Znaki formatujące (2) Rodzaje specyfikatorów typu: – – – – – b – zwraca liczbę całkowitą w postaci binarnej c – zwraca znak ASCII dla podanej wartości całkowitej d – zwraca liczbę ze znakiem w postaci dziesiętnej e – zwraca liczbę w notacji 1 e+3 u – zwraca liczbę bez znaku w postaci dziesiętnej f – zwraca liczbę zmiennoprzecinkową w formacie zależnym od lokalnych ustawień o– zwraca liczbę w postaci ósemkowej s – zwraca łańcuch znaków x – zwraca liczbę w postaci heksadecymalnej (małe litery) X – zwraca liczbę w postaci heksadecymalnej (wielkie litery) ©Wiesław Piasecki 2007 99
Printf - przykłady $n = 1233. 51; $s = "Kupiłem rower za"; printf("%s %d", $s, $n); //Kupiłem rower za 1233 printf("%s %3. 2 f", $s, $n); //Kupiłem rower za 1233. 51 printf('%c', 167); //wyświetli znak paragrafu § Ogólna zasada dotycząca rodziny funkcji printf(): Liczba znaków „%” powinna być równa liczbie parametrów danych. Jest kilka wyjątków jakich? ©Wiesław Piasecki 2007 100
Parsowanie sformatowanego wejścia • Rodzina funkcji sscanf($data, $format) jest podobna w działaniu do funkcji printf() z tą różnicą, że zamiast formatować wyjście umożliwia parsowanie wejścia; – Dane $data muszą dokładnie pasować do formatu $format; – Funkcja sscanf() nadaję się do stosowania tylko tam gdzie istnieje pewność stałości formatu danych wejściowych. Na pewno nie ma to miejsca dla danych wprowadzanych przez użytkownika! Przykład: $data = '123 344 12. 2'; $format = '%d %d %f'; var_dump(sscanf($data, $format)); //array(3) { [0]=> int(123) [1]=> int(344) [2]=> float(12. 2) } ©Wiesław Piasecki 2007 101
Wyrażenia regularne • PHP umożliwia obsługę wyrażeń regularnych kompatybilnych z Perl (PCRE); • Wyrażenia regularne są bardzo potężnym narzędziem ułatwiającym przetwarzanie łańcuchów znakowych; • Wyrażenie regularne jest łańcuchem znakowym określającym wzorzec poprzez zdefiniowanie zbioru zasad dopasowania; • Wyrażenia regularne powinny być używane w przypadku gdy: – Nie da się tego zrealizować za pomocą prostszych funkcji – Wzorzec jest nie znany a’priori – znane są tylko reguły jakie go definiują ©Wiesław Piasecki 2007 102
Składniki wyrażenia regularnego (1) • Ogranicznik – jest to znak, który rozpoczyna i kończy wyrażenie regularne; najczęściej jest nim slash „/”; • Metaznak – każdy metaznak reprezentuje pojedynczy znak we wzorcu. Najczęściej używane metaznaki to: – „. ” – oznacza dopasowanie do dowolnego znak – „^” – oznacza dopasowanie do początku łańcucha znakowego – „$” – oznacza dopasowanie do końca łańcucha znakowego – „s” – oznacza dopasowanie do dowolnego „białego znaku” – „d” – oznacza dopasowanie do dowolnej cyfry – „w” – oznacza dopasowanie do dowolnego znaku nie będącego „białym znakiem” • Metaznaki mogą być wyrażane za pomocą wyrażeń grupujących [], w których można używać zakresów np. /ab[d-ie]/ // wzorzec obejmuje abd, abf, abg , abh i abi ©Wiesław Piasecki 2007 103
Składniki wyrażenia regularnego (2) • Orzecznik ilościowy – określa liczbę wystąpień znaku lub metaznaku znajdujących się za nim we wzorcu. Istnieją cztery typy orzeczników ilościowych: – „*” – dany znak może się pojawić 0 lub wiele razy – „+” – dany znak może się pojawić 1 lub wiele razy – „? ” – dany znak może się pojawić 0 lub 1 razy – „{n, m}” – dany znak może się pojawić co najmniej n razy, ale nie więcej niż m razy; {n, } wyznacza tylko minimalną ilość wystąpień, a {, m} tylko maksymalną ©Wiesław Piasecki 2007 104
Podwyrażenia • Do definiowania podwyrażeń w wyrażeniach regularnych służą nawiasy okrągłe (); np. /ab(cd. )e/ • Podwyrażenie samo w sobie nie ma wpływu na to w jaki sposób główne wyrażenie zostanie wykonane; • Może być połączone z orzecznikiem ilościowym do zbudowania bardziej złożonego wyrażenia np. /a(ab. )+c/ • Może także być używane przechwytywaniu wzorców ©Wiesław Piasecki 2007 105
Sposoby wykorzystanie wyrażeń regularnych • Wyrażenia regularne mogą być wykorzystane do: – Sprawdzania zgodności łańcucha z zdefiniowanym wzorcem – Wyodrębniania łańcuchów znakowych zgodnych z wzorcem – Zamiany łańcuchów znakowych • Dwie pierwsze czynności można wykonać za pomocą następujących funkcji: – preg_match($regex, $str, [optional ] $matches) - zwraca true jeśli istnieje podłańcuch znakowy pasujący do wzorca $regexp; opcjonalnie w $matches zostaje zapisane wszystkie wystąpienia wzorca; – preg_match_all() – umożliwia wykonanie wielokrotnych dopasowań bazując na tym samym wyrażeniu regularnym; ©Wiesław Piasecki 2007 106
Wyrażenia regularne przykłady (1) Przykład wykorzystania funkcji prog_match(): $name = "Walter Scott"; $regex = '/^(w+)s(w+)/'; $mathes = array(); if(preg_match($regex, $name, $mathes)){ var_dump($mathes); } //array(3) { [0]=> string(12) "Walter Scott" [1]=> string(6) "Walter" [2]=> string(5) "Scott" } ©Wiesław Piasecki 2007 107
Wyrażenia regularne przykłady (2) Przykład wykorzystania funkcji prog_mach_all(): $str = 'a 1 aa 2 c 3 c'; Ogranicznik początku i końca $regex = '@([abc])d@'; może być dowolny znak $mathes = array(); if(preg_match_all($regex, $str, $mathes)){ var_dump($mathes); } Wynik: array(2) { [0]=> array(3) { [0]=> string(2) "a 1" [1]=> string(2) "a 2" [2]=> string(2) "c 3" } [1]=> array(3) { [0]=> string(1) "a" [1]=> string(1) "a" [2]=> string(1) "c" } } ©Wiesław Piasecki 2007 108
Wykorzystanie PCRE do zamiany łańcuchów znakowych • Wykorzystanie PCRE do zamiany łańcuchów znakowych daje znacznie szersze możliwości niż „typowa” zamiana łańcuchów dokonywana np. za pomocą funkcji str_replace(); • Funkcją wykorzystującą PCRE do zamiany łańcuchów znakowych jest preg_replace($regexp, $replacement, $subject) : – Zwraca ona wynikowy łańcuch znakowy po dokonaniu zamiany wszystkich wystąpień wzorca reprezentowanego przez wyr. regularne $regexp na $replacement; – Istnieje możliwość użycia znalezionego wystąpienia w łańcuchu go zamieniającym poprzez użycie znaku dolara i numer wystąpienia np. $1 ©Wiesław Piasecki 2007 109
Przykład zamiany łańcuchów znakowych z wykorzystaniem PCRE $body = "[b]This is the bold text![/b]"; $regex = "@[b](. *? )[/b]@"; $replace = "<b>$1</b>"; echo preg_replace($regex, $replace, $body); //This is the text! Pytanie: Dlaczego użyto jako ogranicznika wyrażenia regularnego „@” a nie „/”? W tej funkcji można stosować tablice łańcuchów zamiast samych łańcuchów znakowych. ©Wiesław Piasecki 2007 110
Generowanie dokumentu HTML • Generacja dokumentu rozpoczyna się od pojawienia zapytania HTTP(ang. Hypertext Transfer Protocol), które może być dokonane za pomocą jednej z dwóch metod: – POST – GET • Zapytanie HTTP zawiera różnego typu dane np. dane formularza czy też uploadowany plik; • Po otrzymaniu zapytania serwer dekoduje wiadomość i przekazuje otrzymane do interpretera PHP; • Podczas wysyłania odpowiedzi serwer najpierw zapisuje informacji o : – Typie przesyłanych danych – Kodowaniu – Stanie klienta i serwera ©Wiesław Piasecki 2007 111
Formularz • Formularz jest istotnym elementem strony internetowej. Umożliwia on: – przesyłanie danych od klienta do serwera – prezentację danych – uploadowanie plików • Elementy wchodzące w skład formularza są wyznaczone poprzez ramy <form>…</form> • Formularz może być przesyłany za pomocą jeden z dwóch metod: – POST – GET ©Wiesław Piasecki 2007 112
Przykład formularza z metodą GET <form action="index. php" method="GET"> Wyszukaj <input name="query" type="text"> <input type="hidden" name="ln" value="pl"> <input type="submit" value="Search"> </form> Link URL po zatwierdzeniu formularza: http: //example. org/index. php? query=php&ln=pl Pytanie: Jak do powyższego linku dodać zmienną tablicową o nazwie adres['ulica']="Piękna"? http: //example. org/index. php? query=php&ln=pl& adres[ulica]=Piękna ©Wiesław Piasecki 2007 113
Przykład formularza z metodą POST <form action="index. php" method="POST"> Login <input name="login" type="text"> Hasło <input name="pass" type="password"> <input type="reset" value="Anuluj"> <input type="submit" value="Zaloguj"> </form> Link URL po zatwierdzeniu formularza: http: //localhost/EUCIP/index. php ©Wiesław Piasecki 2007 114
Jak „dostać” się do danych z formularza? • Jeśli znamy sposób przesyłania danych (GET czy POST) to: – Wykorzystując zmienną superglobalną: $_GET lub $_POST w zależności od metody przesyłania możemy pobrać wartość zmiennej z formularza np. $_POST['login'], czy $_GET['adres']['ulica'] • Jeśli nie znamy sposobu przesyłania to: – Wykorzystujemy tablicę supergloabalną $_REQUEST (zawiera ona informacje o: cookie, GET i POST. ) np. $_REQUSET['login'] Problem: Nie wiadomo skąd pochodzą dane, co może stanowić dużą dziurę w systemie zabezpieczeń. ©Wiesław Piasecki 2007 115
GET czy POST? • Metoda POST ze swej natury powinna być wykorzystywana do modyfikacji danych, a GET do otrzymywania danych; • Jednakże w rzeczywistości deweloperzy wykorzystują te metody jak popadnie; • Metoda GET ma ograniczoną pojemność na dane; dane przesyłane za jej pomocą muszą być odpowiednio zakodowane; • Metoda POST powinna być brana pod uwagę, gdy: – Dane muszą być transparentnie kodowane przy pomocy dowolnego zestawu znaków; – Należy przesłać wieloczęściowy formularz np. zawierający plik; – Potrzeba przesłać dużą ilość danych; Żadna z metod POST czy GET nie gwarantuje poufności danych! ©Wiesław Piasecki 2007 116
Uploadowanie pliku (1) • Jest to bardzo często wykonywana operacja i do tego bardzo niebezpieczna; zawsze należy na nią zwracać szczególną uwagę; • Plik może być uploadowawany na serwer jako „wieloczęściowa” transakcja HTTP POST • Maksymalny rozmiar uploadowanych plików przez operację POST można być modyfikowany za pomocą kilku dyrektyw konfiguracyjnych takich jak: – post_max_size – max_input_time – upload_max_filesize ©Wiesław Piasecki 2007 117
Uploadowanie pliku (2) • Po przesłaniu pliku od klienta do serwera, jest on przechowywany jako plik tymczasowy; do momentu zakończenia działania skryptu z jakiego nastąpił upload; • Dostęp do pliku jest możliwy dzięki superglobalnej tablicy $_FILES; indeksy tej tablicy mają takie nazwy jak elementy HTML służące uploadowaniu plików; • Każdy z elementów tablicy $_FILES jest tablicą zawierającą następujące elementy: – – – name – orginalna nazwa pliku type – typ MIME dostarczany przez przeglądarkę size – rozmiar pliku w bajtach tmp_name – nazwa tymczasowej lokacji pliku error – kod błędu powiązany z plikiem; UPLOAD_ERR_OK – oznacza, że upload powiódł się bez błędów ©Wiesław Piasecki 2007 118
Bezpieczeństwo uploadu plików • Zawsze należy sprawdzić czy: – Rozmiar pliku nie jest równy 0; – Kod błędu jest równy UPLOAD_ERR_OK; – Ścieżka katalogu tymczasowego nie jest pusta; – Sprawdzic czy dany plik jest uploadowanym plikiem za pomocą funkcji is_uploaded_file() czy move_uploaded_file(); • Zawsze należy nadawać uploadowanym plikom własne nazwy – w ten sposób można uniknąć wielu nieprzyjemnych konsekwencji. ©Wiesław Piasecki 2007 119
Upload pliku przykład Plik uploadfile. html: <form enctype="multipart/form-data" action="index. php" method="POST"> <input name="MAX_FILE_SIZE" type="hidden" value="50000"> <input name="filedata" type="file"> Definiowanie <input type="submit" value="Send"> maksymalnego rozmiaru </form> pliku Plik index. php: $file. Name = 'filedata' ; if($_FILES[$file. Name]['size']>0) && ($_FILES[$file. Name]['error'] ==UPLOAD_ERR_OK) && is_uploaded_file( $_FILES[$file. Name] ['tmp_name'])) { echo $_FILES[$file. Name]['name']; Sprawdzanie echo $_FILES[$file. Name]['tmp_name']; poprawności echo $_FILES[$file. Name]['size']; uploadu pliku readfile($_FILES[$file. Name]['tmp_name']); } ©Wiesław Piasecki 2007 120
Nagłówek HTTP • Najpierw serwer odpowiada na przychodzące żądanie HTTP wysyłając nagłówek odpowiedzi, a dopiero później przesyłana jest reszta odpowiedzi; -> nagłówek musi więc być wysłany wcześniej niż jakiekolwiek inne dane; • Nagłówek zawiera informacje na temat przesyła-nych danych jak i innych szczegóły tranzakcji; • Element nagłówka jest łańcuchem znakowym zapisanym w następującym formacie: key: value i zakończonym znakiem nowej linii. • Do zmiany nagłówka wykorzystuje się funkcję header() Musi być ona wywołana przed jakimkolwiek wysłaniem danych wyjściowych! ©Wiesław Piasecki 2007 121
Przekierowanie • Do przekierowania użytkownika na inną stronę jest wykorzystywany nagłówek HTTP; Przykład: header("Location: http: //onet. pl"); exit(); Uwaga!!! Funkcja header() musi być ona wywołana przed jakimkolwiek wysłaniem danych wyjściowych! Aby mieć pewność, że żadna z części skryptu nie zostanie wykonana po przekierowaniu najbezpieczniej jest zabezpieczyć się przed tym za pomocą funkcji exit(); • Przy dynamicznym przekierowaniu niezbędne będzie użycie funkcji urlencode(), która zakoduje dane w odpowiedniej formie, zgodnej z standardem specyfikującym składnię adresu URL; ©Wiesław Piasecki 2007 122
Kompresja nagłówka HTTP • HTTP wspiera kompresje i dekompresje danych przy użyciu algorytmy gzip; • Kompresja w istotny sposób zmniejsza rozmiar przesyłanych danych; • Stopień kompresji można dowolnie ustawiać w zakresie od 1 (najmniejsza) do 9 (największa); domyślnie 6; • Im wyższy stopień kompresji tym większe zasoby serwera będą wykorzystane! • Dynamicznie włączanie kompresji dla konkretnej strony dokonuje się za pomocą funkcji ob_start("ob_gzhandle"); powyższy kod powinien się znaleźć na samym początku skryptu; • Włączenie kompresji dla wszystkich stron dobywa się poprzez zmianę domyślnych ustawień pliku php. ini: – Zlib. outout_compression = on – Zlib. outout_compression_level = 7 ©Wiesław Piasecki 2007 123
Buforowanie • Domyślnie przeglądarki buforują znaczną cześć ściągniętych danych; • Czasami istniej potrzeba zastąpienia starej treści nową; w tym celu wykorzystuje się wymuszenie odświeżenia danych poprzez dezaktualizację posiadanych Przykład: header("Cache-Control: no-cache, must-revalidate"); header("Expires: Thu, 31 May 1984 03: 04: 00 GMT"); ©Wiesław Piasecki 2007 124
Jak działa HTTP? ©Wiesław Piasecki 2007 125
Cookies • Pozwalają na przechowywanie małej ilości (4 -6 k. B) danych tekstowych po stronie klienta; • Najczęściej są wykorzystywane do zarządzaniem stanem sesji (HTTP jest protokołem bezsesysjnym); • Nie powinny być stosowane jako magazyn bezpiecznego przechowywania danych; klient może robić z nimi co zechce. • Do ustawienia „ciasteczka” po stronie klienta służy funkcja setcookie(). Jak inne funkcje nagłówka, musi być wywołana na początku skryptu przed wysłaniem jakichkolwiek danych wyjściowych; ©Wiesław Piasecki 2007 126
Funkcja setcookie • Składnia funkcji setcookie("cookie_name", "value", [optional] expire, …); • Dostęp do danych zgromadzonych w „ciasteczku” jest możliwy poprzez supertablice: $_COOKIE["cookie_name"] i $_REQUEST[ "cookie_name"]; • Czas wygaśnięcia cookie jest zdefiniowany przez trzeci parametr. – Jeśli nie został on podany cookie zostanie skasowane po zakończenia sesji przeglądarki; – Jeśli zostanie on podany to usunięcie cookie nastąpi z chwilą utraty daty jego ważności np. time()+86400 //pozwoli na przechowanie ciasteczka na jeden dzień – o ile wcześniej klient go sam nie skasuje; • Dodatkowo istnieją jeszcze trzy opcjonalne parametry w poleceniu setcookie i są to: – Path – umożliwia określenie względnej ścieżki z jakiej dane cookie będzie mogło być odczytywane; – Domain – umożliwia ograniczenie dostępu do ciasteczka tylko dla wybranych domen, stron internetowych; – Secure – wymusza przesyłanie cookie tylko poprzez protokół HTTPS; ©Wiesław Piasecki 2007 127
Przykład zastosowania ciasteczka • Proces zakładania ciasteczka jest dokonywany w dwóch krokach. • Najpierw ciasteczko jest zakładane u klienta. A dopiero później przesyłane do serwera przy następnym żądaniu klienta. Dlatego tablica $_COOKIE nie będzie zawierała nowych informacji do momentu nadejścia kolejnego żądania. Przykład: Zapisanie informacji w ciasteczku <? php $value = 'something from somewhere'; setcookie("Test. Cookie", $value, time()+3600); /* expire in 1 hour */ ? > Odczytanie informacji z ciasteczka: <? php echo $_COOKIE["Test. Cookie"]; // Print an individual cookie print_r($_COOKIE); // View all cookies ? > Przykład usunięcia ciasteczka: <? php setcookie("Test. Cookie", false, -3600); ? > ©Wiesław Piasecki 2007 128
Obsługa sesji • Obsługa sesji w PHP ma na celu zapewnienie sposobu na zachowanie pewnych danych w trakcie następujących po sobie wywołań strony; • Sesje są zarządzane za pomocą unikalnego identyfikatora przekazywanego pomiędzy żądaniami najczęściej poprzez cookie, czasami też jako argument zapytania GET; • Sesje mogą przechowywać dane, które mogą być serailizowane; • Sesje mogą być rozpoczynane na jeden z dwóch sposobów: – Automatyczny – nowa sesja zostanie automatycznie zapoczątkowana gdy przyjdzie żądanie – wymaga ustawienia session. auto_start w pliku php. ini; przechowywanie obiektów w tego typu sesji jest niemożliwe; – Ręczny – na początku każdego skryptu należy wywołać funkcje session_start(); musi być umieszczona na samym początku skryptu ponieważ próbuje ona ustawić ciasteczko u klienta; • W ramach zwiększenia bezpieczeństwa funkcja session_start() powinna być poprzedzona funkcją session_regenerate_id() co zapobiega atakom typu „session fixation”. ©Wiesław Piasecki 2007 129
Przykład obsługi sesji <? php session_regenerate_id(); session_start(); //ustaw zmienną sesji $_SESSION["login"] = "atomek"; //teraz możemy odwolac się do pola login w tablicy $_SESSION echo $_SESSION["login"]; ? > Uwaga!!! Do zmiennej supeglobalnej $_SESSION można odwoływać się dopiero po wywołaniu funkcji session_start(); Ta uwaga nie dotyczy automatycznego tworzenia sesji. ©Wiesław Piasecki 2007 130
Programowanie obiektowe • • Podstawowe pojęcia Definicja klasy Właściwości i metody klasy Dziedziczenie Konstruktory i destruktory Zasięgi widoczności Interfejsy i klasy abstrakcyjne ©Wiesław Piasecki 2007 131
Podstawowe pojęcia • Klasa – jest to opis zbioru obiektów, które mają takie same atrybuty, operacje, związki i znaczenie. (Def. z Inżynierii Oprogramowania) • Obiekt – konkretne wystąpienie abstrakcji ; byt o dobrze określonych granicach i tożsamości, obejmujący stan i zachowanie; egzemplarz klasy. (Def. z Inżynierii Oprogramowania) ©Wiesław Piasecki 2007 132
Definicja klasy • Każda definicja klasy rozpoczyna się od słowa kluczowego class po którym podana jest nazwa klasy • Wewnątrz definicji znajdują się jej właściwości(parametry) oraz metody. Przykład: class Shape{ protected $name="shape"; public function get. Name(){ return $this->name; } } Definicja klasy Shape $obj= new Shape(); echo $obj->get. Name(); ©Wiesław Piasecki 2007 Parametr klasy Definicja metody klasy Utworzenie obiektu klasy Wywołanie metody klasy dla danego obiektu 133
Klasy • Odwołania do metod czy parametrów danej klasy są realizowane przez operator „->”; • Pseudo zmienna $this jest dostępna podczas wywoływania metody dla danego obiektu; $this jest zmienną referencją do wywołującego obiektu. np. $this->name; //umożliwia odwołanie się do wartości parametru name obecnego obiektu; ©Wiesław Piasecki 2007 134
Dziedziczenie klas • Klasa może dziedziczyć właściwości, metody po innej klasie, może także nadpisywać istniejące metody jeśli zajdzie taka potrzeba; • Do dziedziczenia używa się słowa extends. Deklaracja dziedziczenia klasy A po klasie B wyglądała by w następujący sposób: class A extends B{ … } • Dana klasa może dziedziczyć co najwyżej po jednej klasie bazowej ©Wiesław Piasecki 2007 135
Metody klasy • Metody są definiowane tak jak zwykłe funkcje: Przykład: class my. Class{ function myfunction(){ echo "Wywołałeś metodę my. Class: : myfunction"); } } • Do wywołanie innej metody lub parametru klasy z wnętrza dla metody danej klasy używa się pseudo zmiennej $this; Przykład: class my. Class{ function myfunction(){ echo "Wywołałeś metodę my. Class: : myfunction"); } function test(){ $this->myfunction(); } } ©Wiesław Piasecki 2007 136
Właściwości klasy • Właściwość klasy jest to nazwana wartość oznaczająca cechę bytu; (Def. z IO) • Właściwości są deklarowane po zakresie widoczności; Przykład: class my. Class{ public $name; public $value = 1. 3; } • Mogą od razu być inicjalizowane, ale nie można ich inicjalizować poprzez wywołanie jakieś funkcje – do tego służy konstruktor; public $name = this->get. Default. Name(); ©Wiesław Piasecki 2007 137
Przykład dziedziczenia klas class Shape{ protected $name="shape"; public function get. Name(){ return $this->name; } } Dziedziczenie po class Rectangle extends Shape { klasie Shape protected $a = 1; protected $b = 2; protected $name ="Rectangle"; public function get. Area(){return $this->a*$this->b; } } Odwołanie się Nadpisanie class Square extends Rectangle { do metody protected $name ="Square"; przodka public function get. Area(){ return $this->a*$this->a; } public function get. Old. Area(){echo "Rectangle Area=". parent: : get. Area(). "n"; } } $obj= new Square(); Można ją zastąpić za echo $obj->get. Name(). "n"; pomocą $obj->get. Old. Area(); Rectangle: : get. Area() echo "Squer. Area = {$obj->get. Area()}"; ©Wiesław Piasecki 2007 138
Zakres widoczności składowych klasy • Istnieją cztery poziomy widoczności: – public – zasób widoczny z dowolnego zasięgu; – protected – zasób jest widoczny wewnątrz danej klasy oraz w klasach potomnych; – private – zasób jest widoczny tylko w klasie, wewnątrz której został zdefiniowany; – final – zasób jest widoczny z dowolnego zasięgu, ale nie może być nadpisany w klasach potomnych; może być stosowany w odniesieniu tylko do metod i klas; klasa zadeklarowana jako final nie może być dziedziczona; ©Wiesław Piasecki 2007 139
Konstruktor • Konstruktor jest specjalną metodą klasy, która jest wywoływana podczas tworzenia obiektu klasy. Służy on do: – Inicjalizowania zmiennych; – Wykonania startowych operacji takich np. jak podłączenie się do bazy danych, czy otwarcie zewnętrznego pliku; • W PHP 5 metoda konstruktora nazywa się __construct(); Przykład: class my. Class{ function __construct(){ echo __METHOOD__; } function my. Class(){ } } new my. Class(); //php 4 style constructor ©Wiesław Piasecki 2007 140
Destruktor • Destruktor jest specjalną metodą wywoływaną tuż przed zniszczeniem obiektu. Używa się go oczyszczenia pamięci z zbędnych rzeczy: – Rozłączenia z bazą danych – Usunięcia tymczasowych plików Przykład: class my. Class{ function __destruct(){ echo __METHOOD__; } } new my. Class(); • Zniszczenie obiektu odbywa się dopiero po usunięciu wszystkich referencji do niego Przykład: $a = new my. Class(); $b = $a; unset($a); //nie spowoduje wywołania konstruktora ponieważ istnieje jeszcze odwołanie do obiektu ©Wiesław Piasecki 2007 141
Ćwiczenie • Co zostanie wyświetlone po uruchomieniu następującego kodu: class foo{ Get_object_vars() wyświetla public $foo = 'bar'; wszystkie parametry obiektu protected $baz = 'bat'; private $qux = 'bingo'; function __construct(){ var_dump(get_object_vars($this)); } } class bar extends foo{ function __construct(){ var_dump(get_object_vars($this)); } } class baz{ function __construct(){ $foo = new foo(); var_dump(get_object_vars($foo)); } } new foo(); array(2) array(3){{ ["foo"]=> string(3)"bar” ["baz"]=> string(3)"bat”} "bat” new bar(); array(3) ["qux"]=>{ string(5) ["foo"]=>"bingo”} string(3) "bar” ["baz"]=> string(3) "bat” array(1) { ["foo"]=> string(3) "bar”} new baz(); ["qux"]=> string(5) "bingo”} ©Wiesław Piasecki 2007 142
Metody i właściwości statyczne • Metoda/właściwość statyczna jest to metoda/właściwość, do której można się odwołać zawsze tzn. nawet w momencie gdy nie istniej żadnej instancja danej klasy; Przykład: class my. Class 1{ static $a = 3; public static function display(){ echo "Hallo world!"; Odwołanie do zmiennej czy metody statycznej odbywa się } prze klasę } echo my. Class 1: : $a. "n"; // 3 my. Class 1: : display(); // Hallo world! $obj = new my. Class 1(); Nie można się odwoływać do zmiennej, czy metody statycznej przez obiekt!!! $obj->display(); //you can see a notice!!! ©Wiesław Piasecki 2007 143
Stałe klasy • Stałe klasy działają w taki sam sposób jak normalne stałe, z tą różnicą, że są widoczne tylko wewnątrz danej klasy; Przykład: class my. Class. Constant{ const NAME = "Hallo world!"; } echo my. Class. Constant: : NAME ; //Hallo world! • Stałymi klasy mogą być tylko wartości skalarne! • Zalety stałych klasy: – Umożliwiają lepszą organizację kodu – Są znacznie szybciej deklarowane i usuwane niż tradycjonalne stałe ©Wiesław Piasecki 2007 144
Interfejsy i klasy abstrakcyjne • Interfejsy i klasy abstrakcyjne są używane do tworzenia serii powiązań pomiędzy grupą klas; • Klasy abstrakcyjne przede wszystkim definiują pewien podstawowy szkielet zahermetyzowanej encji np. samochód z czterema drzwiami, które można zamykać i otwierać; • Klasy abstrakcyjne nie mogą być użyte bezpośrednio, ale mogą być dziedziczone (klasa potomna musi posiadać „ciała” wszystkich metod abstrakcyjnych swojego przodka); ©Wiesław Piasecki 2007 145
Przykład klasy abstrakcyjnej abstract class Car_Adapter{ Klasa abstrakcyjna zawiera co protected $door_num; najmniej jedną metodę protected $door_state; abstrakcyjną abstract public function close_door(); Metody abstract public function open_door(); abstrakcyjne } class Fiat extends Car_Adapter { Dziedziczenie po public function close_door(){ klasie abstrakcyjnej //. . } public function open_door(){ Zdefiniowanie metod //. . abstrakcyjnych przodka } } • Jeśli klasa zawiera jakąkolwiek metodę abstrakcyjną to musi być ona zdefiniowana jako klasa abstrakcyjna!!! ©Wiesław Piasecki 2007 146
Interfejsy • Interfejsy służą do określenia API (ang. Application Programming Interface), które klasa musi zaimplementować; • Interfejs można użyć np. do zapewnienia klasie potrzebnych operacji bazodanowych dla różnych BD Definicja Przykład: interfejsu interface Data. Store_Adapter{ Deklaracja public function insert(); wykonania interfejsu public function update(); przez klasę } class DB_Data. Store_Adapter implements Data. Store_Adapter { public function insert(){ //. . . Realizacja kontraktu przez klasę – definicja ciał metod wchodzących } w skład interfejsu public function update(){ //. . . } } ©Wiesław Piasecki 2007 147
Przynależność obiektu do klasy • Do sprawdzenia czy dany obiekt należy do konkretnej klasy, lub czy implementuje dany interfejs wykorzystuje się operator instanceof; Przykład: if($obj instanceof My. Class){ echo "$obj is instance of My. Class"; } • Operator instanceof zwraca true dla wszystkich klas przodków konkretnego obiektu ©Wiesław Piasecki 2007 148
Wyjątki • Wyjątki (ang. Exceptions) są obiektami tworzonymi lub wyrzucanymi („thrown”) gdy zaistnieje błąd; • Dostarczają mechanizmu kontroli błędów o znacznie mniejszej ziarnistości niż tradycyjna obsługa błędów w PHP; • Mogą być one obsługiwane w różnych miejscach wykonania skryptu różne typy wyjątków mogą być obsługiwane przez różne części skryptu; • Wszystkie nie obsłużone wyjątki są krytyczne! • Wyjątki mogą być wyrzucane z konstruktora __construct(); • Wyjątki zmieniają przebieg wykonania aplikacji!!! ©Wiesław Piasecki 2007 149
Klasa bazowa Exception • Wyjątki muszą być bezpośrednimi lub pośrednimi (przez dziedziczenie) instancjami klasy Exception; • Klasa Exception posiada: – cztery właściwości: $message, $code, $file, $line; – Osiem metod: • __construct($message=null, $code=0); • Cztery metody zwracające wartości właściwości klasy Exception: get. Message(), get. Code(), get. File(), get. Line(); • Dwie metody zwracające odwróconą ścieżkę wykonania: get. Trace(), get. Trace. As. String(); • Funkcję zwracającą tekstową reprezentację wyjątku : __to. String(); • Prawie wszystkie właściwości klasy Exception są automatycznie uzupełniane przez kompilator; Należy podać tylko komunikat i kod błędu; • Klasy wyjątków zbudowane na podstawie klasy Exception mogą posiadać inne dodatkowe funkcje i właściwości; ©Wiesław Piasecki 2007 150
Wyrzucanie wyjątków • Wyjątki są tworzone i wyrzucane w momencie wystąpienia błędu poprzez użycie konstrukcji throw; Przykład: if($error){ throw new Exception("This is exception"); } • Następnie są przechwytywane w bloku try… catch; jeśli nie zostaną przechwycone powodują wyjątek krytyczny; Przykład: try{ if($error){ throw new Exception("This is exception"); } catch(Exception $e) { //obsługa wyjątku} ©Wiesław Piasecki 2007 151
Przechwytywanie wyjątków Przykład: Utworzenie własnej class my. Exception extends Exception { }; klasy wyjątku try{ new PDO("msyql: dbname=test"); throw new my. Exception("Wystąpił nie znany błąd"); }catch (PDOException $e){ Wyrzucenie echo $e->get. Message(); błędu }catch (my. Exception $e){ Przechwycenie błędu echo $e->get. Message(); }catch (Exception $e){ Gdyby my. Exception nie był obsłużony wcześniej wtedy został by echo $e->get. Message(); przechwycony przez ten blok catch } … Po obsłudze wyjątku program kontynuowany jest od kodu znajdującego się w tym miejscu ©Wiesław Piasecki 2007 152
Przechwytywanie nieobsłużonych wyjątków • W celu przechwycenia nieobsłużonych wyjątków można: – Objąć cały blok programu za pomocą try … catch; podejście to jest mało praktyczne; – Wykorzystać predefiniowaną funkcję, która jest uruchamiana gdy pojawi się nie obsłużony wyjątek; funkcję tą określa się za pomocą funkcji set_exception_handler(); Przykład: function handle. Uncaught. Exception($e){ echo $e->get. Message(); } set_exception_handler("handle. Uncaught. Exception"); throw new Exception("Wyjątek!!!"); echo "To nigdy nie będzie wyświetlone"; //Wyjątek!!! ©Wiesław Piasecki 2007 153
Mechanizm odbicia • Reflection API – zawiera kolekcję funkcji i obiektów, które umożliwiają sprawdzenie części kodu skryptu, tak jakich funkcje i obiekty w czasie jego wykonywania; • Mechanizm odbicia jest bardzo pomocny przy: – Generacji prostej dokumentacji – Stwierdzenia czy pewna funkcjonalność jest dostępna dla skryptu ©Wiesław Piasecki 2007 154
Przykład użycia mechanizmu odbicia (1) <? php /** * Say Hello Dokumentacja do * @param string to funkcji */ function hallo($to="World") { echo "Hallo $to"; } /** * Do foo * @param string $bar Some Bar * @param array $baz An Array of Baz */ function foo($bar, $baz = array()){} ? > <h 1>Documentation</h 1> <? php $funcs=get_defined_functions(); foreach ($funcs["user"] as $func){ try{ $func = new Reflection. Function($func); }catch (Reflection. Extension $e){} $prototype=$func->get. Name(). '('; $args = array(); ©Wiesław Piasecki 2007 Pobranie informacji o funkcjach Utworzenie obiektu odbicia funkcji Pobranie nazwy funkcji 155
Przykład użycia mechanizmu odbicia (2) Pobranie foreach ($func->get. Parameters() as $param){ parametrów funkcji $arg =''; if($param->is. Passed. By. Reference()){ Sprawdzenie czy parametr jest $arg= '&'; przekazywany przez referencję } Sprawdzenie czy parametr if($param->is. Optional()){ jest opcjonalny $arg = '['. $param->get. Name(). ' = '. $param->get. Default. Value(). ']'; }else $arg = $param->get. Name(); Pobranie nazwy $args[]=$arg; parametru i } wartości domyślnej $prototype. = implode(", ", $args). ')'; Pobranie komentarza echo "<h 2>$prototype</h 2>"; funkcji echo " <p> Comment; </p> <pre> ". $func->get. Doc. Comment(). " </pre> <p> File: ". $func->get. File. Name(). " Lines: ". $func->get. Start. Line(). " - ". $func->get. End. Line(). " </p>"; } ? > Pobranie numeru początku i końca linii. ©Wiesław Piasecki 2007 156
Przykład użycia mechanizmu obicia (3) ©Wiesław Piasecki 2007 157
PHP i relacyjne bazy danych • Wprowadzenie do relacyjnych baz danych ©Wiesław Piasecki 2007 158
Baza Danych • Baza danych to zbiór danych zapisanych w ściśle określony sposób w strukturach odpowiadających założonemu modelowi danych. • Cechy bazy danych: – magazyn dużej ilości informacji; – dane przechowywane są w sposób trwały; – dane są intensywnie wykorzystywane; – dostępne dla wielu użytkowników; – bazy danych są bezpieczne (odporne na fizyczne uszkodzenie systemu); – dane zachowują integralność (logiczną spójność). ©Wiesław Piasecki 2007 159
Relacyjna baza danych • Relacyjne bazy danych (RDB) są oparte na tabelach i relacjach (związkach) między nimi zdefiniowanych jak podzbiór iloczynu kartezjańskiego; • Tabela jest zorganizowaną, dwuwymiarową kolekcją danych. Składa się 0 lub z wielu wierszy, a każdy wiersz z 1 lub wielu kolumn; • Kolumny definiują strukturę danych; • Wiersze zawierają dane o określonej przez kolumny strukturze; • Związki pomiędzy tabelami są określane na podstawie wartości znajdujących się w kolumnach tabel leżących na końcach definiowanego przez siebie związku; ©Wiesław Piasecki 2007 160
Indeksy • Relacyjna baza danych jest zoptymalizowana pod kątem wyszukiwania i wybierania danych; • Ta optymalizacja w głównej mierze opiera się na indeksach; • Cechy indeksów: – Mogą być stworzone w oparciu o jedną albo o kilka kolumn; – W znaczący sposób zwiększają szybkości operacji w tabeli; – Nie każda kolumna może być indeksowana (istnieją typy danych, których się nie indeksuje); – Indeksy powinny być zdefiniowane dla tych kolumn, które są najczęściej wykorzystywane podczas przeszukiwania; ©Wiesław Piasecki 2007 161
Związki • Związki pomiędzy tabelami są istotnym elementem umożliwiającym logiczne połączenie danych znajdujących się (nie zawsze) w różnych tabelach; • Związek definiowany jest za pomocą klucz główny i odpowiadającego mu klucza obcego; • Rodzaje związków: – Jeden do jednego; – Jeden do wielu; – Wiele do wielu; Czytelnik id_czytelnik: VARCHAR nazwisko: VARCHAR imie: VARCHAR ©Wiesław Piasecki 2007 zamawia Zamowienie id_zamowienia: VARCHAR data_zamowienia: DATE data_realizacji: DATE 162
SQL (1) • SQL (ang. Structure Query Language) jest podstawowym językiem manipulacji danych stosowanym w RBD; • Występuje on w wielu odmianach najpopularniejszą z nich jest SQL -92; • Niektóre typy danych w My. SQL: – – – – – Int lub integer - 32 bitowa liczba całkowita ze znakiem; Smallint - 16 bitowa liczba całkowita ze znakiem; float- 32 bitowa liczba zmiennoprzecinkowa ze znakiem; double - 64 bitowa liczba zmiennoprzecinkowa ze znakiem; Char – ciąg znaków o określonej długości; Varchar – ciąg znaków o zmiennej długości; Date – data Date. Time – data i czas; Time. Stamp – okres czasu; Text – długi łańcuch znakowy; ©Wiesław Piasecki 2007 163
SQL (2) • Standard SQL zabrania umieszczanie znaków specjalnych np. „n”; • Łańcuch znakowych w PHP różni się od tego w bazie danych tym, że : – w PHP może on reprezentować dane binarne, a w BD w większości przypadków nie; – Większość BD wykorzystuje ' (pojedynczy cudzysłów) do enkapsulacji łańcuchów znakowych; • Do przechowywania danych binarnych najczęściej używa się typu BLOB (ang. Binary Large OBject); ©Wiesław Piasecki 2007 164
Podstawowe operacje BD • Tworzenie bazy danych: CREATE DATABASE <dbname>; • Tworzenie tabeli: CREAT TABLE <tablename> ( <colname> <coltype> [<colattributes>], [. . <colname> <coltype> [<colattributes>]] ) Przykład: Zdefiniowanie CREATE TABLE book ( klucza głównego id INT NOT NULL PRIMARY KEY, isbn VARCHAR(13), Przykład ustalenia titl e. VARCHAR(255), rozmiaru danych author VARCHAR(255), publisher VARCHAR(255) ) ©Wiesław Piasecki 2007 165
Tworzenie indeksów • Do tworzenie indeksów dodatkowych służy polecenie: CREATE INDEX <indexname> ON <tablename> (col 1 [, …, coln]) Przykład: CREATE INDEX book_isbn ON book (isbn); UWAGA!!! Tabela book z kolumną isbn musi istnieć przed stworzeniem indeksu! ©Wiesław Piasecki 2007 166
Tworzenie powiązań pomiędzy tabelami ___ _ ____________ ______ 1 CREATE TABLE book ( 2 CREATE TABLE book_chapter ( id INT NOT NULL PRIMARY KEY, id_chapter INT NOT NULL PRIMARY KEY isbn VARCHAR(13), id_fk INT title VARCHAR(255), REFERENCES book (id), author VARCHAR(255), chapter_number INT NOT NULL, publisher VARCHAR(255) chapter_title VARCHAR(255) ) ) 3 ALTER TABLE book_chapter ADD INDEX (id_fk), ADD CONSTRAINT fk_book_TO_book_chapter FOREIGN KEY (id_fk) REFERENCES book (id); ©Wiesław Piasecki 2007 167
Usuwanie obiektów bazodanowych • Do usuwania obiektów bazodanowych służy polecenie: DROP <object. Type> <objectname> Przykład: – Usunięcie tabeli book_chapter: DROP TABLE book_chapter; – Usunięcie perspektywy View 1: DROP VIEW view 1; ©Wiesław Piasecki 2007 168
DML • Do manipulowania danym służ instrukcje języka DML(ang. Data Manipulating Language): – INSERT – umożliwia wstawianie danych do tabeli; – UPDATE – umożliwia zmianę istniejących danych; – DELETE – daje możliwość usunięcia danych; – SELECT – umożliwia wybór danych; ©Wiesław Piasecki 2007 169
Dodawanie danych • Instrukcja INSERT ma dwie formy: – INSERT INTO <tablename> VALUES (<fieldvalue>[, …, <fieldvalue>]) • Wymaga podania wartości wszystkich kolumn dla danej tabeli, w kolejności w jakiej zostały one utworzone; – INSERT INTO <tablename> (<field 1>[, …, <fieldn>) VALUES (<fieldvalue>[, …, <fieldvalue>]) • Forma instrukcji umożliwiająca podanie tylko wybranych pól oraz listy ich wartości; • Umożliwia wykorzystanie wartości domyślnych poszczególnych kolumn; • Uniwersalna wersja polecana INSERT. ©Wiesław Piasecki 2007 170
Aktualizacja danych • Instrukcja UPDATE: UPDATE <tablename> SET col 1=value 1 [, …, coln=valuen] [WHERE where_condition] – Aktualizuje wartości kolumn col 1, …, coln dla tych rekordów, które spełniają warunek where_condition; gdy nie jest on wyszczególniony aktualizacja dotyczy się wszystkich rekordów z danej tabeli; Przykład: UPDATE book SET publisher ='Willey Inter. Science' WHERE author = 'Martin Pelikan'; ©Wiesław Piasecki 2007 171
Usuwanie danych • Instrukcja DELETE ma następującą składnie: DELETE FROM <tablename> [WHERE where_condition]; – Gdy występuję bez WHERE usuwa wszystkie rekordy z tabeli tablename; w przeciwnym wypadku usuwa tylko te rekordy, które spełniają warunek where_condition; Przykład: DELETE FROM book_chapter WHERE chapter_number > 3; ©Wiesław Piasecki 2007 172
Wybieranie danych • Do wybierania danych z jednej bądź kilku tabel służy instrukcja SELECT: SELECT [DISTINCT] [FROM table_references [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], . . . ] ] ©Wiesław Piasecki 2007 173
Instrukcja SELECT przykłady (1) Przykłady: – Wyświetl wszystkie rekordy z tabeli book: Wybranie wszystkich książek SELECT * FROM book; – Wyświetl wszystkie książki autorstwa Stephena Kinga: Warunek SELECT * FROM book WHERE nałożony na author='Stephen King'; rekordy – Wyświetl wszystkich autorów z tabeli book: SELECT DISTINCT author FROM book; Usuwa powtarzające się wiersze z zapytania Określenie kolumny danych jaka powinna być zwrócona ©Wiesław Piasecki 2007 174
Instrukcja SELECT przykłady (2) Przykłady: – Wyświetlić tytuły książek George’a Orwella i Stephena Kinga: SELECT title FROM book WHERE author = 'George Orwell' OR author='Stephen King'; – Wyświetlić nazwy rozdziałów do poszczególnych książek: Operator logiczny w warunku Dokładne określenie źródłowej tabeli SELECT book. title, book_chapter. title FROM book INNER JOIN book_chapter Odzwierciedlenie związku pomiędzy ON book. id=book_chapter. id_fk; tabelami ©Wiesław Piasecki 2007 175
- Slides: 175