View
12
Download
1
Category
Preview:
Citation preview
Lector univ. dr. Adrian Runceanu
Tehnologii Web
1
Universitatea “Constantin Brâncuşi” din Târgu-Jiu Facultatea de Inginerie
Departamentul de Automatică, Energie şi Mediu
Curs 8
Limbajul PHP
(partea III)
2
curs 8
1. Tipuri compuse
1.1. Tipul tablou
1.1.1. Crearea tablourilor
1.1.2. Tablouri multidimensionale
1.1.3. Parcurgerea tablourilor
1.1.4. Sortarea tablourilor
1.1.5. Transformarea tablourilor
1.2. Tipul obiect
Tehnologii WEB
3
curs 8
1.2. Tipul obiect
1.2.1. Clasele
1.2.2. Alcătuirea şi instanţierea unei clase
1.2.3. Definirea unei metode constructor
1.2.4. Utilizarea moştenirii
1.2.5. Redefinirea metodelor
1.2.6. Invocarea unei metode redefinite
1.2.7. Tablouri cu obiecte
Tehnologii WEB
4
Tipuri de date compuse
În PHP sunt utilizate două tipuri de date compuse:
1. tipul tablou
2. tipul obiect
Tehnologii WEB
5
curs 8
1. Tipuri compuse
1.1. Tipul tablou
1.1.1. Crearea tablourilor
1.1.2. Tablouri multidimensionale
1.1.3. Parcurgerea tablourilor
1.1.4. Sortarea tablourilor
1.1.5. Transformarea tablourilor
1.2. Tipul obiect
Tehnologii WEB
6
1.1. Tipul tablou
Tipul tablou se referă la colecţii de date indexate, numite elements, care pot fi utilizate împreună.
• Acest tip este foarte puternic şi des folosit în PHP.
• Astfel, tablourile se dovedesc a fi cele mai potrivite containere pentru stocarea datelor în scopul manipulării acestora (sortare).
Tehnologii WEB
7
• De asemenea, funcţiile care extrag rezultatele obţinute în urma interogării unei baze de date, întorc tablouri.
• În plus, unele dintre variabilele predefinite în PHP au tipul tablou:
1. $_GET
2. $_POST
3. $_SESSION
Tehnologii WEB
8
• Un element al unui tablou este precizat indicând numele tabloului şi cheia (numit şi indexul elementului).
• Cheile pot fi: 1. numere întregi (tabloul corespunzător este de tip numeric)
2. şiruri de caractere (tabloul corespunzător este de tip asociativ)
• Cheile având ultimul tip precizat trebuie incluse între ghilimele sau apostrofuri.
Exemple:
$note['matematica'] = 9
sau
$note["matematica"]= 9
Tehnologii WEB
9
curs 8
1. Tipuri compuse
1.1. Tipul tablou
1.1.1. Crearea tablourilor
1.1.2. Tablouri multidimensionale
1.1.3. Parcurgerea tablourilor
1.1.4. Sortarea tablourilor
1.1.5. Transformarea tablourilor
1.2. Tipul obiect
Tehnologii WEB
10
1.1.1. Crearea tablourilor
Există următoarele 3 modalităţi de creare a unui tablou:
1. prin atribuire directă
2. folosind funcţia array()
3. precizând cheile odată cu utilizarea funcţiei array()
Tehnologii WEB
11
1. Atribuirea directă
• Utilizarea acestei modalitati presupune precizarea numelui tabloului, precum si a cheilor si valorilor fiecarui element.
• In cazul in care se doreste utilizarea unei chei de tip sir de caractere, se procedeaza ca in exemplul urmator:
$elev["scoala"] ="Mihail Sadoveanu";
$elev["clasa"]=10;
$elev["varsta"]=16;
Tehnologii WEB
12
• În exemplul oferit, PHP creează automat un tablou cu trei elemente.
• Este important de menţionat că elementele tabloului $elev pot fi indicate ulterior precizând cheia de tip şir de caractere şi/sau cheia numerică.
• Cheile numerice primesc automat valori întregi succesive, prima fiind 0.
Tehnologii WEB
13
10-M
ay-
13
• De exemplu, vârsta unui elev poate fi precizat în următoarele două moduri:
$varsta=$elev["varsta"];
$varsta=$elev[2];
• Modificarea valorii unui element se realizează printr-o nouă atribuire, ca în exemplul prezentat în continuare (elevul este promovat în anul şcolar următor):
$elev["clasa"]=11;
Tehnologii WEB
14
10-M
ay-
13
• Pentru crearea unui tablou prin atribuire directă, pot fi precizate şi chei numerice, ca în exemplul următor:
$orase[0]="Bucuresti";
$orase[1]="Iasi";
$orase[2]="Timisoara";
Tehnologii WEB
15
10-M
ay-
13
• Este posibil să se pornească de la o cheie numerică diferită de 0 sau să se indice chei care nu au valori succesive.
• De asemenea, este posibil să nu se precizeze nici o cheie, ca în exemplul următor:
$tariUE[]="Franta";
$tariUE[]="Germania";
$tariUE[]="Romania";
• În acest exemplu, PHP creează automat tabloul $tariUE, atribuind elementelor acestuia chei numerice succesive, începând cu valoarea 0 (adică 0, 1 şi 2).
Tehnologii WEB
16
10-M
ay-
13
2. Utilizarea funcţiei array()
• Dacă funcţia array() se apelează fără argumente, va fi creat un tablou vid (fără elemente).
• Pentru a crea un tablou nevid, valorile elementelor acestuia trebuie precizate ca argumente, sub forma unei liste ale cărei componente sunt separate prin caracterul virgulă, ca în exemplul prezentat în continuare: $orase=array("Bucuresti", "lasi", "Timisoara");
• Valorile precizate ca argumente ale funcţiei vor fi stocate ca elemente în tabloul $orase, în ordinea precizării lor, cheile acestora având valori întregi succesive începând cu 0.
Tehnologii WEB
17
10-M
ay-
13
3. Precizarea cheilor
• PHP oferă posibilitatea de a preciza cheile elementelor odată cu crearea unui tablou prin intermediul funcţiei array().
• În acest caz, este necesar ca argumentele funcţiei să fie reprezentate de o listă de perechi cheie-valoare, separate prin virgulă, în care cheia şi valoarea sunt separate prin simbolul „=>".
• Cheile precizate pot fi numerice sau şiruri.
Tehnologii WEB
18
10-M
ay-
13
Exemplu în care cheile sunt numerice:
$orase=array(0=>"Bucuresti", 1=>"Iasi", 2=>"Timisoara");
• Dacă se doreşte precizarea unor chei de tip şir de caractere, se procedează astfel:
$orase2=array (
"Capitala"=>"Bucuresti",
"Moldova"=>"Iasi",
"Banat"=>"Timisoara");
• În exemplul de mai sus, cheile celor trei elemente ale tabloului sunt, în ordine, "Capitala", "Moldova" şi "Banat".
Tehnologii WEB
19
10-M
ay-
13
curs 8
1. Tipuri compuse
1.1. Tipul tablou
1.1.1. Crearea tablourilor
1.1.2. Tablouri multidimensionale
1.1.3. Parcurgerea tablourilor
1.1.4. Sortarea tablourilor
1.1.5. Transformarea tablourilor
1.2. Tipul obiect
Tehnologii WEB
20
10-M
ay-
13
1.1.2. Tablouri multidimensionale
• În exemplele anterioare, pentru a ilustra cele trei metode de creare a tablourilor, au fost utilizate tablouri unidimensionale.
• Deşi acestea sunt mai rar utilizate, PHP oferă şi posibilitatea de a crea tablouri multidimensionale.
Tehnologii WEB
21
10-M
ay-
13
În continuare este prezentat un exemplu în care este creat un tablou bidimensional, prin intermediul funcţiei array():
$note=array ('sem1' =>
array('matematica'=>9,
'fizica'=>9,
'informatica'=>10),
'sem2'=>
array('matematica' =>9,
'fizica'=>8,
'informatica'=>9) );
Tehnologii WEB
22
10-M
ay-
13
Acelaşi tablou poate fi creat prin atribuire directă în felul următor:
$note["sem1"] [ "matematica"] =9;
$note["sem1"] [ "fizica"] =9;
$note["sem1"] ["informatica"] =10;
$note["sem2"] ["matematica"] =9;
$note["sem2"] [ "fizica"] =8;
$note["sem2"] ["informatica"] =9;
• Atunci când este posibil, tablourile multidimensionale se vor crea folosind instrucţiunile repetitive (de exemplu instrucţiunea for).
Tehnologii WEB
23
10-M
ay-
13
curs 8
1. Tipuri compuse
1.1. Tipul tablou
1.1.1. Crearea tablourilor
1.1.2. Tablouri multidimensionale
1.1.3. Parcurgerea tablourilor
1.1.4. Sortarea tablourilor
1.1.5. Transformarea tablourilor
1.2. Tipul obiect
Tehnologii WEB
24
10-M
ay-
13
1.1.3. Parcurgerea tablourilor
Există diverse modalităţi pentru a parcurge elementele unui tablou (operaţie cunoscută şi sub denumirea de traversarea tabloului), cea mai elegantă dintre acestea constând în utilizarea instrucţiunii foreach, cu următoarea sintaxă:
foreach($tablou as [$cheie=>] [&] $valoare)
{
grup de instrucţiuni
}
Tehnologii WEB
25
10-M
ay-
13
• Variabila $cheie este opţională şi, atunci când este specificată, conţine cheia elementului curent.
• De asemenea, caracterul „&" este opţional şi, atunci când este prezent, permite modificarea explicită a valorii elementului $valoare prin intermediul instrucţiunilor incluse în grupul grup) şi transmiterea automată a valorii către tablou ($tablou).
• În cele mai multe cazuri, nu se doreşte modificarea valorii elementelor, astfel încât caracterul „&" nu se foloseşte.
Tehnologii WEB
26
10-M
ay-
13
Exemplu în care se utilizează instrucţiunea foreach:
<?php
$orase=array("Bucuresti", "lasi", "Timisoara");
echo "Orase romanesti:<br />";
foreach($orase as $cheie=>$valoare) {
echo "$cheie=$valoare<br />";
}
/*
Se va afisa:
Orase romanesti:
0=Bucuresti
1=Iasi
2=Timisoara
*/
?>
Tehnologii WEB
27
10-M
ay-
13
O altă modalitate de parcurgere a elementelor unui tablou consta în utilizarea funcţiilor list() şi each(), ca în exemplul următor:
<?php $orase=array("Bucuresti", "lasi", "Timisoara"); echo "Orase romanesti:<br />"; reset($orase); while (list($cheie, $valoare) = each($orase)) { echo "$cheie=$valoare<br />"; } ?>
Tehnologii WEB
28
10-M
ay-
13
• Funcţia list() permite atribuirea simultană de valori mai multor variabile utilizând elementele unui tablou:
list(Svariabila1, $variabila2, ...) = $tablou;
• Ca rezultat al execuţiei instrucţiunii anterioare, variabilelor $variabila1, $variabila2, ... li se vor atribui valorile elementelor $tablou[0], $tablou[1], ... , echivalent cu a realiza următoarele atribuiri:
$variabila1 = $tablou[0];
$variabila2 = $tablou[1];
. . .
Tehnologii WEB
29
10-M
ay-
13
• Funcţia each() întoarce perechea cheie-valoare curentă a tabloului primit ca argument şi deplasează pointerul intern la următorul element.
• Perechea întoarsă este, de fapt, un tablou cu patru elemente:
• cele având cheile 0 şi "key" păstrează cheia elementului
• iar cele având cheile 1 şi "value" păstrează valoarea acestuia
Tehnologii WEB
30
10-M
ay-
13
• Pentru traversarea unui tablou este utilizat un pointer (numărator) intern al acestuia care înregistrează poziţia curentă.
• Dacă se foloseşte funcţia each() pentru parcurgerea unui tablou, spre deosebire de instrucţiunea foreach, este necesar ca – în prealabil – să se apeleze funcţia reset(), care va muta pointerul intern la începutul tabloului.
Tehnologii WEB
31
10-M
ay-
13
curs 8
1. Tipuri compuse
1.1. Tipul tablou
1.1.1. Crearea tablourilor
1.1.2. Tablouri multidimensionale
1.1.3. Parcurgerea tablourilor
1.1.4. Sortarea tablourilor
1.1.5. Transformarea tablourilor
1.2. Tipul obiect
Tehnologii WEB
32
10-M
ay-
13
1.1.4. Sortarea tablourilor
Pentru sortarea tablourilor sunt utilizate o serie de funcţii dintre, care menţionăm:
1. sort() – sortează ascendent un tablou în funcţie de valoarea elementelor
2. rsort() – sortează descendent un tablou în funcţie de valoarea elementelor
3. asort() – sortează ascendent un tablou asociativ în funcţie de valoarea elementelor
4. arsort() – sortează descendent un tablou asociativ în funcţie de valoarea elementelor
5. ksort() - sortează ascendent un tablou în funcţie de cheie
6. krsort() - sortează descendent un tablou în funcţie de cheie
Tehnologii WEB
33
10-M
ay-
13
Prototipul sort() este următorul:
bool sort(array tablou [, int parametru])
• După cum se poate observa, funcţia sort() primeşte ca argument obligatoriu numele unui tablou pe care îl va sorta ascendent, în funcţie de valorile elementelor sale.
Tehnologii WEB
34
10-M
ay-
13
• argumentul opţional parametru este utilizat pentru a schimba comportamentul funcţiei la sortare şi poate avea ca valoare următoarele constante:
1. sort_regular (valoare implicită) - elementele sunt comparate normal
2. sort_numeric - elementele sunt comparate din punct de vedere numeric
3. sort_string - elementele sunt comparate ca şiruri de caractere codul ASCII al primului caracter/cifră)
Tehnologii WEB
35
10-M
ay-
13
• Funcţia sort() întoarce valoarea true, în caz de succes, şi false în cazul în care sortarea nu s-a produs.
• În primul caz, funcţia atribuie noi chei elementelor tabloului.
Exemplu de utilizare:
<?php
$alfanumeric=array("B", "a", 5, 100, "A");
function sorteaza($tablou, $parametru=SORT_REGULAR) {
sort($tablou, $parametru);
foreach ($tablou as $cheie=>$valoare) {
echo "tablou[".$cheie."]=".$valoare."<br />";
}
}
Tehnologii WEB
36
10-M
ay-
13
sorteaza($alfanumeric);
/* Se va afisa:
tablou[0]=A
tablou[1]=B
tablou[2]=a
tablou[3]=5
tablou[4]=100
*/
Tehnologii WEB
37
10-M
ay-
13
sorteaza($alfanumeric, SORT_NUMERIC); /* Se va afisa: tablou[0]=B tablou[1]=a tablou[2]=A tablou[3]=5 tablou[4]=100 */ sorteaza($alfanumeric, SORT_STRING); / * Se va afisa: tablou[0]=100 tablou[1]=5 tablou[2]=A tablou[3]=B tablou[4]=a */ ?>
Tehnologii WEB
38
10-M
ay-
13
curs 8
1. Tipuri compuse
1.1. Tipul tablou
1.1.1. Crearea tablourilor
1.1.2. Tablouri multidimensionale
1.1.3. Parcurgerea tablourilor
1.1.4. Sortarea tablourilor
1.1.5. Transformarea tablourilor
1.2. Tipul obiect
Tehnologii WEB
39
10-M
ay-
13
1.1.5. Transformarea tablourilor
În PHP sunt definite o serie de funcţii utilizate pentru transformarea tablourilor.
Prin transformare se înţelege:
1. unirea tablourilor
2. extragerea/eliminarea unor porţiuni din acestea
Tehnologii WEB
40
10-M
ay-
13
1. Unirea tablourilor
• Pentru unirea a două sau mai multe tablouri într-unul singur, se utilizează funcţia array_merge() al cărei prototip este următorul:
array array_merge(array tablou1 [, array tablou2 [, array …]])
• Funcţia reuneşte elementele tablourilor precizate ca argumente, astfel încât elementele unuia sunt adăugate la sfârşitul celui anterior, întorcând tabloul rezultat.
• Dacă unele elemente au aceleaşi chei de tip şir de caractere, ultima valoare o va suprascrie pe cea anterioară.
• Nu acelaşi lucru se întâmplă cu cheile numerice.
Tehnologii WEB
41
10-M
ay-
13
Exemplu:
<?php $tablou1=array("oras"=>"Bucuresti", 10, 89); $tablou2=array("abac","computer","oras"=>"Braila",4); $rezultat=array_merge($tablou1, $tablou2); print_r($rezultat); /* Se va afisa: Array ( [oras]=>Braila [0]=>10 [1]=>89 [2]=>abac [3]=>computer [4]=> 4 ) */ ?>
Tehnologii WEB
42
10-M
ay-
13
2. Extragerea unei porţiuni dintr-un tablou
• Funcţia array_slice(), care extrage o porţiune dintr-un tablou, are următorul prototip: array array_slice(array tablou, int offset [, int lungime [,
bool pastreazacheile ]] ) • Aceasta funcţie extrage din tablou, elementele precizate
prin intermediul argumentelor offset şi lungime. • Dacă offset nu este negativ, secvenţa de elemente
extrase începe cu cel având poziţia offset în raport cu începutul tabloului.
• Dacă acest argument este negativ, poziţia primului element extras va fi calculată în raport cu sfârşitul tabloului.
• Dacă argumentul lungime nu este precizat, vor fi extrase toate elementele până la sfârşitul tabloului.
Tehnologii WEB
43
10-M
ay-
13
Exemplu:
<?php $tablou=array("rosu", "galben", "albastru", "verde", "negru"); $extras=array_slice($tablou, 2); print_r($extras); /* Se va afisa: Array ( [0]=> albastru [1]=> verde [2]=> negru ) */
Tehnologii WEB
44
10-M
ay-
13
$tablou=array("rosu", "galben", "albastru", "verde", "negru"); $extras=array_slice($tablou, -2, 1); print_r($extras) ; /* Se va afisa: Array ( [0]=> verde ) */ $tablou=array("rosu", "galben", "albastru", "verde", "negru"); $extras=array_slice($tablou, 0, 3); print_r($extras) ; /* Se va afisa: Array ( [0] => rosu [1] => galben [2] => albastru ) */
Tehnologii WEB
45
10-M
ay-
13
$tablou=array("rosu", "galben", "albastru", "verde", "negru"); $extras=array_slice($tablou, 2, -1); print_r($extras); /* Se va afisa: Array ( [0]=> albastru [1]=> verde ) */ $tablou=array("rosu", "galben", "albastru", "verde", "negru"); $extras=array_slice($tablou,2,-1,true);
print_r($extras); /* Se va afisa:
Array ( [2]=> albastru [3]=> verde ) */ ?>
Tehnologii WEB
46
10-M
ay-
13
curs 8
1.2. Tipul obiect
1.2.1. Clasele
1.2.2. Alcătuirea şi instanţierea unei clase
1.2.3. Definirea unei metode constructor
1.2.4. Utilizarea moştenirii
1.2.5. Redefinirea metodelor
1.2.6. Invocarea unei metode redefinite
1.2.7. Tablouri cu obiecte
Tehnologii WEB
47
10-M
ay-
13
1.2. Tipul obiect
• Principiul de bază al programării orientate pe obiecte (POO) îl reprezintă încapsularea datelor.
• Un program care nu este orientat spre obiecte este organizat ca un set de funcţii şi un set de variabile globale utilizate de acele funcţii.
• Orice funcţie poate opera folosind orice variabilă globală.
Tehnologii WEB
48
10-M
ay-
13
• Un program orientat spre obiecte combină funcţii şi variabile într-o unitate, cunoscută sub numele de clasă.
• Un program orientat spre obiecte caracteristic este alcătuit din mai multe clase.
• Programele orientate spre obiecte pot fi mai uşor de înţeles decât programele care nu sunt orientate spre obiecte, deoarece interacţiunile între clasele unui program orientat spre obiecte sunt relativ reduse ca număr.
Tehnologii WEB
49
10-M
ay-
13
• Pe lângă încapsularea datelor, o altă caracteristică importantă al POO este moştenirea.
• Moştenirea constă în aceea că putem declara anumite clase ca fiind derivate din alte clase de bază.
• În cele mai multe situaţii clasa derivată (numită şi clasa copil) extinde functionalităţile clasei de bază (numită şi clasa părinte).
• În acest fel se reduce foarte mult cantitatea de cod necesară.
Tehnologii WEB
50
10-M
ay-
13
curs 8
1.2. Tipul obiect
1.2.1. Clasele
1.2.2. Alcătuirea şi instanţierea unei clase
1.2.3. Definirea unei metode constructor
1.2.4. Utilizarea moştenirii
1.2.5. Redefinirea metodelor
1.2.6. Invocarea unei metode redefinite
1.2.7. Tablouri cu obiecte
Tehnologii WEB
51
10-M
ay-
13
1.2.1. Clasele
•O clasă este de fapt o structură care conţine variabile (membrii) şi funcţii (metode).
• Metodele sunt operaţiile pe care membrii clasei le pot efectua.
• Membrii şi metodele declarate într-o clasă aparţin clasei respective şi se accesează specificând numele clasei.
Tehnologii WEB
52
10-M
ay-
13
• O clasă poate include o metodă specială, numită "metoda constructor" sau "constructor".
• Metoda constructor este o funcţie care are acelaşi nume cu al clasei şi este folosită pentru a crea instanţe sau membri ai clasei, numiţi "obiecte".
Tehnologii WEB
53
10-M
ay-
13
• Diferenţa între clasă şi obiect este importantă.
• Dacă o clasă poate fi asimilată unui tip de date, un obiect poate fi echivalat:
1. cu o variabilă
2. cu o valoare având un anumit tip de date
• Practic, o clasă este o "fabrică" de obiecte, care produce obiecte cu aceeaşi structură, având proprietăţi şi metode identice.
Tehnologii WEB
54
10-M
ay-
13
curs 8
1.2. Tipul obiect
1.2.1. Clasele
1.2.2. Alcătuirea şi instanţierea unei clase
1.2.3. Definirea unei metode constructor
1.2.4. Utilizarea moştenirii
1.2.5. Redefinirea metodelor
1.2.6. Invocarea unei metode redefinite
1.2.7. Tablouri cu obiecte
Tehnologii WEB
55
10-M
ay-
13
1.2.2. Alcătuirea şi instanţierea unei clase
• Definirea unei clase începe cu cuvântul cheie "class".
• Variabilele sau membrii clasei se specifica folosind cuvântul "var".
• Funcţiile sau metodele unei clase se declară specificând cuvântul "function".
Tehnologii WEB
56
10-M
ay-
13
• Clasele au un constructor al clasei adică o metodă care instanţiază o clasă.
• Numele funcţiei constructor este acelaşi cu numele clasei.
• Structura generală de alcătuire a unei clase este următoarea: class nume_clasa { var membru1; var membru2; ................. function nume_functie(); { function metoda1(); function metoda2(); ................. } };
Tehnologii WEB
57
10-M
ay-
13
Exemplu:
<?php
class ContBanca {
var $sold = 0;
function c_depozit($suma) {
$this->sold = $this->sold + $suma;
}
function obtine_sold() {
return $this->sold;
}
}
?>
Tehnologii WEB
58
10-M
ay-
13
• Clasa "ContBanca" are un singur membru, "$sold" şi două metode: "c_depozit()" şi "obţine_sold()".
• Membru (variabila) "$sold" este definită de o instrucţiune "var".
• Clasa "ContBanca" atribuie variabilei "$sold" valoarea iniţială zero ( Nu este necesară atribuirea unei valori iniţiale unei proprietăţi, dar astfel programele devin mai simple şi mai uşor de citit).
• Cele două metodele sunt definite folosind cuvântul cheie "function". (Diferenţa dintre metode şi funcţii este legată de amplasarea acestora; metodele sunt definite în interiorul claselor, în timp ce funcţiile sunt definite în exteriorul acestora).
Tehnologii WEB
59
10-M
ay-
13
• Instanţierea unei clase se face prin operatorul "new", având următoarea formă generală:
$nume_variabila = new nume_clasa();
• Variabila "$nume_variabila" conţine o referinţă la obiectul clasei "nume_clasa".
• În continuare referirea metodelor clasei se face prin operatorul de referenţiere "->" ca mai jos:
$nume_variabila->Metoda1();
• Variabila apelează metoda cu numele "Metoda1()", care aparţine clasei "nume_clasa".
Tehnologii WEB
60
10-M
ay-
13
• Ştergerea instanţelor unei clase se face simplu prin apelarea funcţiei:
ubset($nume_variabila)
• Dupa această ştergere, orice apel de genul "$nume_variabila->Metoda1();" va fi semnalat ca eroare.
Tehnologii WEB
61
10-M
ay-
13
Exemplu:
<?php
class ContBanca {
var $sold = 0;
function c_depozit($suma) {
$this->sold = $this->sold + $suma; }
function obtine_sold() {
return $this->sold; }
}
$cont = new ContBanca();
$cont->c_depozit(90);
echo "<br /> Soldul este : ". $cont->obtine_sold();
?>
Tehnologii WEB
62
10-M
ay-
13
• Prima instrucţiune instanţiază un obiect "ContBanca" folosind operatorul "new" şi stochează referinţa la acest obiect în variabila "$cont", care va fi utilizată ulterior pentru a obţine acces la metodele obiectului.
• A doua instrucţiune foloseşte variabila "$cont", (care face referire la obiectul "ContBanca" creat de prima instrucţiune).
• Operatorul "->" arată că PHP trebuie să invoce
metoda "c_depozit()" asupra obiectului desemnat de variabila "$cont".
Tehnologii WEB
63
10-M
ay-
13
• Cea de-a doua instrucţiune invocă metoda "c_depozit()" a obiectului, furnizând argumentului valoarea 90. • După cum este definită, metoda "c_depozit",
aceasta incrementează valoarea membrului "$sold" cu valoarea argumentului din paranteze, "$suma".
• Cea de-a treia instrucţiune invocă metoda "obtine_sold()", care returnează valoarea membrului "$sold". • Instrucţiunea afişează valoarea returnată prin
intermediul unei instrucţiuni "echo", afişând "Soldul este : 90".
Tehnologii WEB
64
10-M
ay-
13
curs 8
1.2. Tipul obiect
1.2.1. Clasele
1.2.2. Alcătuirea şi instanţierea unei clase
1.2.3. Definirea unei metode constructor
1.2.4. Utilizarea moştenirii
1.2.5. Redefinirea metodelor
1.2.6. Invocarea unei metode redefinite
1.2.7. Tablouri cu obiecte
Tehnologii WEB
65
10-M
ay-
13
1.2.3. Definirea unei metode constructor
• Pentru ca o clasă să fie eficientă, ar trebui să aibe mai mulţi membri.
• De exemplu, clasa "ContBanca", pe lângă membrul "$sold", ar necesita membri care să definească numele şi id-ul posesorului.
• O nouă versiune a clasei, care include trei membri şi o metodă constructor:
Tehnologii WEB
66
10-M
ay-
13
<?php class ContBanca { var $cont_id; var $nume_posesor; var $sold = 0; function ContBanca($id, $nume, $suma){ $this->cont_id = $id; $this->nume_posesor = $nume; $this->sold = $suma; } function c_depozit($suma) { $this->sold = $this->sold + $suma; return $this->sold; } } ?>
Tehnologii WEB
67
10-M
ay-
13
• Constructorul este "function ContBanca()", aşa cum se observă, are acelaşi nume ca al clasei.
• PHP apelează automat această funcţie la invocarea operatorului "new".
• Argumentele constructorului sunt folosite pentru a stabili valorile iniţiale ale membrilor noului obiect, "$id", "$nume" şi "$suma".
Tehnologii WEB
68
10-M
ay-
13
Iată cum s-ar putea folosi noua clasă, adaugăm codul de mai jos după datele de definire a clasei, pe care nu le mai repetăm:
<?php
// Aici sunt adaugate datele pentru definirea clasei
$cont = new ContBanca(8, “Popescu Costica”, 100);
echo "<br /> Contul $cont->cont_id apartine lui $cont->nume_posesor";
$cont->c_depozit(90);
echo "<br /> Soldul este $cont->sold";
?>
Tehnologii WEB
69
10-M
ay-
13
• Instructiunea $cont = new ContBanca(8, “Popescu Costica”,100);
obţine accesul la membrii obiectului în mod direct, transferandu-le valorile "8", "Popescu Costica" şi "100".
• Datele de ieşire ale acestui exemplu sunt urmatoarele:
Contul 8 apartine lui Popescu Costica Soldul este 190
Tehnologii WEB
70
10-M
ay-
13
curs 8
1.2. Tipul obiect
1.2.1. Clasele
1.2.2. Alcătuirea şi instanţierea unei clase
1.2.3. Definirea unei metode constructor
1.2.4. Utilizarea moştenirii
1.2.5. Redefinirea metodelor
1.2.6. Invocarea unei metode redefinite
1.2.7. Tablouri cu obiecte
Tehnologii WEB
71
10-M
ay-
13
1.2.4. Utilizarea moştenirii
• Aşa cum s-a explicat la început, un avantaj al programării orientate spre obiecte este facilitatea cunoscută sub numele de moştenire.
• Pentru a înţelege cum funcţionează, prezint un exemplu care arată modul de derivare a unei clase "ContCurent" din clasa de bază "ContBancar", definită anterior şi pe care o salvăm într-un fişier extern "contbanca.php":
Tehnologii WEB
72
10-M
ay-
13
<?php include("contbanca.php"); class ContCurent extends ContBanca { var $cec_nr; function ContCurent($id, $nume, $suma, $cecnr) { $this->cont_id = $id; $this->nume_posesor = $nume; $this->sold = $suma; $this->cec_nr = $cecnr; } function primire_cec($cecnr, $suma) { $this->sold = $this->sold - $suma; } function obtine_sold() { return $this->sold; } } ?>
Tehnologii WEB
73
10-M
ay-
13
• Exemplul foloseşte o instrucţiune "include" pentru a obţine accesul la definiţia clasei "ContBanca"(ar putea fi plasate şi în acelaşi fişier).
• Cuvântul cheie "extends" stabileşte identitatea clasei "ContCurent" ca fiind derivată a clasei "ContBanca".
• Clasa derivată defineşte: • un membru - "$cec_nr" • un constructor • două metode: "primire_cec()" şi "obtine_sold()"
• Important este că această clasă mai include membrii:
"$cont_id", "$nume_posesor" şi "$sold", care sunt definiţi în clasa de bază, în plus va moşteni şi metoda "c_depozit()".
• Constructorul atribuie valori membrilor moşteniţi, dar şi membrilor noi definiţi în clasa derivată.
Tehnologii WEB
74
10-M
ay-
13
• Cum putem folosi această clasă derivată?
• Creem un obiect "ContCurent", adaugăm datele acestuia după codul de definire a clasei derivate prezentate mai sus:
<?php
// Aici sunt adaugate datele pentru definirea clasei derivate
$cont = new ContCurent(8, "Popescu Costica", 100, 11);
$cont->primire_cec(11, 150);
$cont->c_depozit(250);
echo "<br /> Soldul este". $cont->obtine_sold();
?>
• Se observă că metoda "c_depozit()", care este definită în clasa de bază, este invocată ca şi cum ar fi fost definită în clasa derivată; metodele moştenite nu necesită un tratament de natura specială.
Tehnologii WEB
75
10-M
ay-
13
curs 8
1.2. Tipul obiect
1.2.1. Clasele
1.2.2. Alcătuirea şi instanţierea unei clase
1.2.3. Definirea unei metode constructor
1.2.4. Utilizarea moştenirii
1.2.5. Redefinirea metodelor
1.2.6. Invocarea unei metode redefinite
1.2.7. Tablouri cu obiecte
Tehnologii WEB
76
10-M
ay-
13
1.2.5. Redefinirea metodelor
• Uneori, o clasă existentă include o metodă care nu este adecvată pentru o clasă derivată.
• În loc de a defini nouă clasă fără referire la o clasă de bază, se poate anula metoda inadecvată adăugând o metodă cu acelaşi nume în clasa derivată.
• Astfel la instanţiere va fi folosită metoda, cu acelaşi nume, din clasa derivată.
Tehnologii WEB
77
10-M
ay-
13
<?php class ContBanca2 { var $cont_id; var $nume_posesor; var $sold = 1; function ContBanca2($id, $nume, $suma) { $this->cont_id = $id; $this->nume_posesor = $nume; $this->sold = $suma; } function inchide_cont() { $suma = $this->sold; $this->sold = 1; return $this->sold; } } ?>
Tehnologii WEB
78
10-M
ay-
13
• Să presupunem că dorim să derivăm din aceasta o clasă care reprezintă un nou tip de cont bancar, cu dobândă.
• La închiderea contului, programul trebuie să calculeze dobânda pe care să o adauge la soldul curent şi să returneze suma acumulată.
Tehnologii WEB
79
10-M
ay-
13
<?php class ContEco extends ContBanca2
{ function inchide_cont($zile, $rata)
{
$suma = $this->sold * $rata * ($zile / 365);
$suma = $suma + $this->sold;
$this->sold = 1;
return $suma;
}
}
?>
Tehnologii WEB
80
10-M
ay-
13
• În cadrul clasei derivată (clasa copil) este definită o metodă numită "inchide_cont()".
• O metodă cu acelasi nume există şi în clasa de bază (clasa parinte), dar are o altă definiţie.
• În continuare creem un obiect "ContEco" şi invocăm metoda inchide_cont() astfel:
<?php // Aici sunt adaugate datele pentru definirea clasei de baza, ContBanca2
// Aici sunt adaugate datele pentru definirea clasei derivate, ContEco
$cont = new ContEco(8, "Didi", 100); echo "<br /> Didi primeste ". $cont->inchide_cont(22, 0.8);
?> Va fi afişat şirul: "Didi primeste 104.82191780822"
• Este invocată metoda "inchide_cont" definită de clasa copil, nu cea definită în clasa părinte.
• Astfel metoda definită în clasa părinte a fost anulată (redefinită) de către metoda, cu acelaşi nume, definită în clasa copil.
Tehnologii WEB
81
10-M
ay-
13
curs 8
1.2. Tipul obiect
1.2.1. Clasele
1.2.2. Alcătuirea şi instanţierea unei clase
1.2.3. Definirea unei metode constructor
1.2.4. Utilizarea moştenirii
1.2.5. Redefinirea metodelor
1.2.6. Invocarea unei metode redefinite
1.2.7. Tablouri cu obiecte
Tehnologii WEB
82
10-M
ay-
13
1.2.6. Invocarea unei metode redefinite
• Dacă se încearcă să se invoce o metodă anulată (redefinită), se va obţine o eroare.
• Dacă în exemplul anterior, am fi scris instrucţiunea: "echo "<br /> Didi primeste ". $cont->inchide_cont();", fără cele două argumente (22, 0.8), încercând astfel să se facă referire la metoda anulată "inchide_cont()", s-ar primi mesajele de eroare:
Warning: Missing argument 1 for ContEco::inchide_cont(), Warning: Missing argument 2 for ContEco::inchide_cont()
• Cu toate acestea, este posibilă invocarea metodei redefinite.
• Prin specificarea în clasa copil a numelui clasei parinte, urmat de o pereche de caractere două puncte, (::) şi metoda redefinită.
• Astfel se poate indica scriptului PHP să folosească metoda, cu acelaşi nume, definită în clasa parinte, nu metoda definită în clasa copil.
Tehnologii WEB
83
10-M
ay-
13
• Invocarea unei metode redefinite este un procedeu mai complicat, pentru începători este mai bine a fi evitat deoarece poate complica înţelegerea scriptului.
• Exemplu de clasă derivată care utilizează acest procedeu:
<?php
class ContEco extends ContBanca2 {
function inchide_cont($zile, $rata) {
$suma = ContBanca2::inchide_cont();
$suma = $suma + $suma * $rata * ($zile / 365);
return $suma;
}
}
?>
Tehnologii WEB
84
10-M
ay-
13
curs 8
1.2. Tipul obiect
1.2.1. Clasele
1.2.2. Alcătuirea şi instanţierea unei clase
1.2.3. Definirea unei metode constructor
1.2.4. Utilizarea moştenirii
1.2.5. Redefinirea metodelor
1.2.6. Invocarea unei metode redefinite
1.2.7. Tablouri cu obiecte
Tehnologii WEB
85
10-M
ay-
13
1.2.7. Tablouri cu obiecte
• Tablourile (numite şi matrice) reprezintă o
modalitate convenabilă pentru lucrul cu mai multe valori.
• Valorile stocate în tablouri pot face referire la
obiecte exact aşa cum procedează în cazul numerelor sau al şirurilor.
• Un tablou care face referire la obiecte se numeşte "tablou cu obiecte".
Tehnologii WEB
86
10-M
ay-
13
clasa "ContBanca" şi două clase copil ale acesteia: <?php class ContBanca { var $cont_id; var $nume_posesor; var $sold; var $tip_cont; function ContBanca($id, $nume, $suma, $tip) { $this->cont_id = $id; $this->nume_posesor = $nume; $this->sold = $suma; $this->tip_cont = $tip; } function dump() { return "Cont = ". $this->cont_id. " posesor = ". $this->nume_posesor. " sold = ". $this->sold. " tip = ". $this->tip_cont; } }
Tehnologii WEB
87
10-M
ay-
13
// Incepe codul pt. prima clasa copil
class ContCurent extends ContBanca { function ContCurent ($id, $nume, $suma) { ContBanca::ContBanca($id, $nume, $suma,
"curent"); } }
// Incepe codul pt. a doua clasa copil class ContEco extends ContBanca { function ContEco ($id, $nume, $suma) { ContBanca::ContBanca($id, $nume, $suma,
"economii"); } } ?>
Tehnologii WEB
88
10-M
ay-
13
• Remarcati faptul ca metodele constructor ale celor doua clase copil fac referire la constructorul clasei parinte, reutilizând în mod eficient caracteristica furnizata de clasa parinte, reducand astfel codul programului.
• Acum, creem instante ale claselor copil si stocam referintele la aceste instante într-un tablou:
<?php $cont[0] = new ContCurent(11, “Popescu Costica",
100); $cont[1] = new ContEco(12, "Didi", 140); ?>
Tehnologii WEB
89
10-M
ay-
13
• De exemplu, dupa ce am definit clasele si am stocat instantele in tabloul "$cont[]" de mai sus, adaugam urmatorul cod:
<?php
// Aici adaugam datele pt. definirea claselor
// Aici adaugam codul pentru stocarea instantelor in tablou
foreach ($cont as $contul) {
echo "<br /> ". $contul->dump();
}
?>
Tehnologii WEB
90
10-M
ay-
13
• Din moment ce referintele instantelor incluse în tablou se refera la un obiect la care este asociata o metoda "dump()", tabloul este simplu de parcurs, prin invocarea metodei "dump()", care doar afiseaza membrii claselor unui obiect "ContBancar" sau ale unui obiect din una din clasele sale derivate.
• Exemplul va afisa urmatorul rezultat:
Cont = 11 posesor = Popescu Costica sold = 100 tip = curent
Cont = 12 posesor = Didi sold = 140 tip = economii
Tehnologii WEB
91
10-M
ay-
13
Întrebări?
92
Recommended