PHP i wzorce projektowe - mgr inż. Wiesław Piasecki

Download Report

Transcript PHP i wzorce projektowe - mgr inż. Wiesław Piasecki

PHP
Wiesław Piasecki
Literatura
• Davey Shafik, Ben Ramsey: Zend PHP 5 Certification Study
Guide;
• W. Jason Gilmore : Beginning PHP and MySQL 5: From
Novice to Professional, Second Edition (Paperback) ;
• Edward Lecky-Thompson, Heow Eide-Goodman, Steven D.
Nowicki, Alec Cove: PHP5. Zaawansowane programowanie
• Dokumentacja PHP5 www.php.net ;
• Dokumentacja Oracle Database Express Edition
http://www.oracle.com/pls/xe102/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 PHP5
• 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 setName($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', [email protected]);
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'
$str1= ' disc';
$str .= $str1;
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?
$str1 = 'ABC';
$str2 = 'ABD';
echo (int) ($str1>$str2); // 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 (warunek1){instr1
} else if (warunek2){instr2
} else { instr3
}
• 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
switch(wyrażenie){
case val1: instr.1; break;
case val2: 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(expr1;expr2;expr3) { instrukcje; }
• expr1 jest obliczane tylko jeden raz na początku działania
pętli
• expr2 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ę
• expr3 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($arg1,$arg2,…){
Instrukcje;
return $return_value;
}
• name – określa nazwę funkcji
• Listę argumentów funkcji stanowią zmienne: $arg1,$arg2,…
• 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($arg1){
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 displayArray($a){
reset($a);
while(key($a)!==null){
//dlaczego !== ,a nie != ?
echo key($a). "=>".current($a)."\n";
next($a);
}
}
displayArray($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('10t','1t','4t');
natsort($a);
var_dump($a);
//array(3) { [1]=> string(2) "1t" [2]=> string(2) "4t" [0]=>
string(3) "10t" }
©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_rand2(&$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
}
}
$keys1 = array(); $keys2 = array();
$a = array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
array_rand2($a,$keys1,2);
// pierwsze losowanie dwóch elem.
array_rand2($a,$keys2,2);
// drugie losowania dwóch elem.
var_dump($keys1);
var_dump($keys2);
©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 $who\n
– 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 $
„\xFF”znak w notacji heksadecymalnej np.„\x3a” to „:”
„\377” znak w notacji ósemkowej np. „\052” 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('Hallo123',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($str1, $str2) – zwraca wartość równą 0, jeśli
łańcuchy znakowe są takie same;
bierze pod uwagę wielkości liter;
– strcasecmp($str1, $str2) – 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 ="12as1";
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($str1,$str2,int [optional] $start_pos) – zwraca
indeks pierwszego znalezionego wystąpienia $str2 w
$str1, rozpoczynając przeszukiwanie od pozycji
$start_pos (opcja) - w przypadku gdy go nie znajdzie
zwraca false;
– strstr($str1,$str2) – zwraca cześć łańcucha $str1
rozpoczynającą się od $str2,
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 = "aa1234112";
$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 = "[email protected]";
echo substr_replace($mail,"",strpos($mail,'@'));
//janKowalski
©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("%.2n",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 1e+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.2f", $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-i\e]/
// 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 = 'a1aa2c3 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) "a1" [1]=> string(2) "a2" [2]=>
string(2) "c3" }
[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 dane 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"><br>
Hasło <input name="pass" type="password"><br>
<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:
$fileName = 'filedata' ;
if($_FILES[$fileName]['size']>0) && ($_FILES[$fileName]['error']
==UPLOAD_ERR_OK) && is_uploaded_file( $_FILES[$fileName]
['tmp_name'])) {
echo $_FILES[$fileName]['name'];
Sprawdzanie
echo $_FILES[$fileName]['tmp_name'];
poprawności
echo $_FILES[$fileName]['size'];
uploadu pliku
readfile($_FILES[$fileName]['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 danych
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?
HTTP Request
Accept: gzip
HTTP Response
Location: http://php.net
Content-type: text/html
©Wiesław Piasecki 2007
125
Cookies
• Pozwalają na przechowywanie małej ilości (4-6kB) 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("TestCookie", $value, time()+3600); /* expire in 1 hour */
?>
Odczytanie informacji z ciasteczka:
<?php
echo $_COOKIE["TestCookie"]; // Print an individual cookie
print_r($_COOKIE);
// View all cookies
?>
Przykład usunięcia ciasteczka:
<?php setcookie("TestCookie",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 getName(){
return $this->name;
}
}
$obj= new Shape();
echo $obj->getName();
Definicja klasy Shape
Parametr klasy
Definicja metody
klasy
Utworzenie obiektu
klasy
Wywołanie metody
klasy dla danego
obiektu
©Wiesław Piasecki 2007
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 myClass{
function myfunction(){
echo "Wywołałeś metodę myClass::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 myClass{
function myfunction(){
echo "Wywołałeś metodę myClass::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 myClass{
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->getDefaultName();
©Wiesław Piasecki 2007
137
Przykład dziedziczenia klas
class Shape{
protected $name="shape";
public function getName(){ return $this->name; }
}
Dziedziczenie po
class Rectangle extends Shape {
klasie Shape
protected $a = 1;
protected $b = 2;
protected $name ="Rectangle";
public function getArea(){return $this->a*$this->b;}
}
Odwołanie się
Nadpisanie
class Square extends Rectangle {
do metody
metody
protected $name ="Square";
przodka
public function getArea(){ return $this->a*$this->a;}
public function getOldArea(){echo "Rectangle Area=".parent::getArea()."\n";}
}
$obj= new Square();
Można ją zastąpić za
echo $obj->getName()."\n";
pomocą
$obj->getOldArea();
Rectangle::getArea()
echo "SquerArea = {$obj->getArea()}";
©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 myClass{
function __construct(){
echo __METHOOD__;
}
function myClass(){
}
}
new myClass();
//php4 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 myClass{
function __destruct(){ echo __METHOOD__; }
}
new myClass();
• Zniszczenie obiektu odbywa się dopiero po usunięciu wszystkich referencji
do niego
Przykład:
$a = new myClass();
$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"]=>
["foo"]=> string(3)
string(3)"bar”
"bar” ["baz"]=>
["baz"]=> string(3)
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 myClass1{
static $a = 3;
public static function display(){
echo "Hallo world!";
Odwołanie do zmiennej czy
metody statycznej odbywa się
}
prze klasę
}
echo myClass1::$a ."\n"; // 3
myClass1::display();
// Hallo world!
$obj = new myClass1();
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 myClassConstant{
const NAME = "Hallo world!";
}
echo myClassConstant::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 DataStore_Adapter{
Deklaracja
public function insert();
wykonania interfejsu
public function update();
przez klasę
}
class DB_DataStore_Adapter implements DataStore_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 MyClass){
echo "\$obj is instance of MyClass";
}
• 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:
getMessage(), getCode(), getFile(), getLine();
• Dwie metody zwracające odwróconą ścieżkę wykonania: getTrace(),
getTraceAsString();
• Funkcję zwracającą tekstową reprezentację wyjątku : __toString();
• 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 myException extends Exception { };
klasy wyjątku
try{
new PDO("msyql:dbname=test");
throw new myException("Wystąpił nie znany błąd");
}catch (PDOException $e){
Wyrzucenie
echo $e->getMessage();
błędu
}catch (myException $e){
Przechwycenie błędu
echo $e->getMessage();
}catch (Exception $e){
Gdyby myException nie był obsłużony
wcześniej wtedy został by
echo $e->getMessage();
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 handleUncaughtException($e){
echo $e->getMessage();
}
set_exception_handler("handleUncaughtException");
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()){} ?>
<h1>Documentation</h1>
<?php $funcs=get_defined_functions();
foreach ($funcs["user"] as $func){
try{
$func = new ReflectionFunction($func);
}catch (ReflectionExtension $e){}
$prototype=$func->getName().'(';
$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->getParameters() as $param){
parametrów funkcji
$arg ='';
if($param->isPassedByReference()){
Sprawdzenie czy parametr jest
$arg= '&';
przekazywany przez referencję
}
Sprawdzenie czy parametr
if($param->isOptional()){
jest opcjonalny
$arg = '['.$param->getName().' = '.$param->getDefaultValue().']';
}else $arg = $param->getName();
Pobranie nazwy
$args[]=$arg;
parametru i
}
wartości domyślnej
$prototype .= implode(",",$args).')';
Pobranie komentarza
echo "<h2>$prototype</h2>";
funkcji
echo " <p> Comment; </p>
<pre> ".$func->getDocComment()." </pre> <p> File: " .$func->getFileName().
" <br /> Lines: " .$func->getStartLine(). " - " .$func->getEndLine()." </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 MySQL:
–
–
–
–
–
–
–
–
–
–
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
DateTime – data i czas;
TimeStamp – 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 eVARCHAR(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> (col1
[,…,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 <objectType> <objectname>
Przykład:
– Usunięcie tabeli book_chapter:
DROP TABLE book_chapter;
– Usunięcie perspektywy View1:
DROP VIEW view1;
©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> (<field1>[,…,<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 col1=value1 [,…, coln=valuen]
[WHERE where_condition]
– Aktualizuje wartości kolumn col1,…,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 InterScience'
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
author='Stephen King';
na 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