»  Pagina principala  »  PHP si mysql »  Clase si obiecte in PHP

Clase si obiecte in PHP

O clasa este o colectie de variabile si functii care opereaza asupra variabilelor respective. Sintaxa folosita pentru declararea unei clase in PHP este:
class nume_clasa {
// date membre
var nume_variabila_1
...
var nume_variabila_m
// metode
function nume_functie_1 (parametri) {
... // definitia functiei
}
...
function nume_functie_n (parametri) {
... // definirea functiei
}
}

Pentru numele unei clase poate fi utilizat orice identificator permis in PHP cu o singura exceptie: sdtclass; acest identificator este folosit de PHP in scopuri interne. In PHP functiile ale caror identificatori incep cu '_' sunt considerate functii magice si utilizarea acestora nu este recomandata. In PHP, datele membre nu pot fi initializate decat cu valori constante. Pentru a initializa variabilele cu valori care nu sunt constante trebuie folosit un constructor. Mai jos aveti exemple de clasa in care initializarile nu sunt corecte:
class Nepermis {
var $data = date ("Y-m-d");
var $nume = $prenume;
var $dest = 'Mihai '. 'Claudiu';
var $obiecte = array ("minge", "pantof");


Obiecte
In PHP clasele sunt considerate a fi tipuri de date; ele pot fi privite ca fiind "amprentele" variabilelor propriu-zise. Pentru a crea o variabila al carei tip este o clasa trebuie utilizat operatorul new. In continuare vom defini o clasa Aritmetica cu doua date membre x si y care sunt numere intregi si doua metode care realizeaza adunarea, respectiv inmultirea lor.
class Aritmetica {
var x = 2;
var y = 3;
function Suma ( ) {
return $this -> x + $this -> y;
}
function Produs ( ) {
return $this -> x * $this -> y;
}
}

Pentru a crea un obiect de tipul Aritmetica vom utiliza o instructiune de tipul:
$aritm = new Aritmetica;
Acum putem utiliza metodele clasei; pentru a afisa suma sau produsul celor doua numere vom putea apela cele doua metode astfel:
echo $aritm -> Suma ( );
echo $aritm -> Produs ( );

Vom obtine rezultatele 5, respectiv 6. Valorile datelor membre pot fi si ele modificate prin instructiuni de tipul:
$aritm -> x = 5;
$aritm -> y = 4;

Daca, in urma modificarii apelam din nou metodele Suma 9 ) si Produs ( ), rezultatele vor fi 9, respectiv 20.

Exemplu
Rezultat
<?php
class PHP4 {
var $salut = "Salut PHP4!";
function Salut ( ) {
return $this -> salut;
}
}
$salutare = new PHP4;
echo $salutare -> Salut( )."<br>";
?>
Salut PHP4!

In acest exemplu a fost utilizata pseudo-variabila $this. Aceasta este folosita pentru a indica faptul ca se opereaza asupra unei date membre a obiectului curent.

Extinderea claselor
Deseori este necesara definirea unor clase cu proprietati (date membre) si metode asemanatoare. Pentru a usura definirea unor astfel de clase a fost introdus conceptul de extindere (derivare) a claselor. O clasa derivata va pastra toate proprietatile si metodele clasei pe care o extinde si poate contine diferite proprietati si metode noi. Nu exista nici o posibilitate de a elimina din clasa derivata anumite proprietati sau metode ale clasei de baza. O anumita clasa poate avea o singura clasa parinte Clasa pe care o extinde o clasa derivata poarta denumirea de clasa de baza sau clasa parinte.; asadar, in PHP nu este permisa mostenirea Pastrarea de catre clasa extinsa a metodelor si proprietatilor clasei din care este derivata poarta denumirea de mostenire. multipla. Pentru a extinde o anumita clasa se utilizeaza cuvantul cheie extends. In urmatorul exemplu vom extinde clasa Aritmetica; vom adauga inca o variabila si vom crea doua noi functii: una pentru calculul sumei celor trei variabile si una pentru calcularea produsului lor:
class Aritmetica3 extends Aritmetica {
var z = 4;
function Suma3 ( ) {
return $this -> x + $this -> y + $this -> z;
}
function Produs3 ( ) {
return $this -> x * $this -> y * $this -> z;
}
}

Daca definim un obiect prin intermediul unei instructiuni de genul:
$aritm3 = new Aritmetica3;
atunci pentru acest obiect vom putea utiliza atat metodele definite in cadrul clasei Aritmetica3: Suma3 ( ) si Produs3 ( ), cat si metodele definite in cadrul clasei de baza Aritmetica: Suma ( ) si Produs ( ). In continuare aveti un exemplu care ilustreaza modul in care pot fi create si utilizate clasele derivate.

Exemplu
Rezultat

<?php
class Aritmetica {
var $x = 2;
var $y = 3;
function Suma ( ) {
return $this -> x + $this -> y;
}
function Produs ( ) {
return $this -> x * $this -> y;
}
}
class Aritmetica3 extends Aritmetica {
var $z = 4;
function Suma3 ( ) {
return $this -> x + $this -> y + $this -> z;
}
function Produs3 ( ) {
return $this -> x * $this -> y * $this -> z;
}
}
$aritm3 = new Aritmetica3;
echo "<b>Inainte de modificare:</b>";
echo "<br>";
echo "Suma primelor doua numere: ";
echo $aritm3 -> Suma ( ) . "<br>";
echo "Produsul primelor doua numere: ";
echo $aritm3 -> Produs ( ) . "<br>";
echo "Suma celor trei numere: ";
echo $aritm3 ->Suma ( ) . "<br>";
echo "Produsul celor trei numere: ";
echo $aritm3 -> Produs ( ) . "<br>";
$aritm3 -> x = 5;
$aritm3 -> y = 4;
$aritm3 -> z = 3;
echo "<br><br>";
echo "<b>Dupa modificare:</b><br>";
echo "<br>";
echo "Suma primelor doua numere: ";
echo $aritm3 -> Suma3 ( ) . "<br>";
echo "Produsul primelor doua numere: ";
echo $aritm3 -> Produs3 ( ) . "<br>";
echo "Suma celor trei numere: ";
echo $aritm3 -> Suma3 ( ) . "<br>";
echo "Produsul celor trei numere: ";
echo $aritm3 -> Produs3 ( ) . "<br>";
?>

Inainte de modificare:
Suma primelor doua numere: 5
Produsul primelor doua numere: 6
Suma celor trei numere: 5
Produsul celor trei numere: 6


Dupa modificare:

Suma primelor doua numere: 12
Produsul primelor doua numere: 60
Suma celor trei numere: 12
Produsul celor trei numere: 60

In PHP clasele trebuie definite inaintea utilizarii lor; asadar clasa parinte va fi definita intotdeauna inaintea clasei fiu Relatia dintre o clasa derivata si clasa pe care o extinde poarta denumirea de relatie parinte - fiu..

Constructori
Un constructor este o metoda (functie) a unei clase care este apelata automat in momentul in care este creata o noua instanta a clasei (cu ajutorul operatorului new). In PHP este considerata ca fiind un constructor orice functie care are acelasi nume cu clasa in interiorul careia este definita. Constructorii pot fi folositi pentru initializarea datelor membre cu valori care nu sunt constante. Ei pot avea argumente, iar acestea pot fi optionale. Pentru a putea utiliza clasa fara a specifica nici un parametru in momentul crearii unui obiect, se recomanda stabilirea unor valori implicite pentru toate argumentele constructorului. In cazul in care nu este definit un constructor pentru o anumita clasa, se utilizeaza constructorul clasei de baza, daca aceasta exista. De exemplu, pentru urmatoarea secventa de cod, in momentul crearii obiectului corespunzator variabilei $b, va fi apelat constructorul clasei A.
class A {
function A ( ) {
echo "Constructorul clasei A<br>";
}
function B ( ) {
echo "O functie obisnuita a clasei A.<br>";
}
}
class B extends A {
function C ( ) {
echo "O functie obisnuita a clasei B.<br>";
}
}
$b = new B;

In PHP apelul constructorului clasei de baza trebuie sa fie explicit daca este necesara executarea operatiilor corespunzatoare. In majoritatea limbajelor de programare exista functii speciale numite destructori care sunt apelate automat in momentul "distrugerii" unui obiect. In PHP nu exista destructori.

Operatorul ::
Uneori este utila folosirea unor metode sau variabile ale clasei de baza sau ale unei clase care nu a fost instantiata inca. In acest scop a fost introdus operatorul ::. Pentru a descrie modul de utilizare al acestui operator vom prezenta mai intai un exemplu:
class A {
function exemplu ( ) {
echo "Functia clasei de baza. <br>";
}
}
class B extends A {
function exemplu ( ) {
echo "Functia redefinita<br>\n";
A :: exemplu ( );
}
}
A :: exemplu ( );
$b = new B;
$b -> exemplu ( );

Prin intermediul instructiunii A :: exemplu ( ); este apelata metoda exemplu ( ) a clasei A, asadar se afiseaza mesajul 'Functia clasei de baza' cu toate ca nu exista nici un obiect care este o instanta a acestei clase, deci nu putem scrie o instructiune de tipul $a -> exemplu ( ); In schimb apelam metoda $b -> exemplu ( ); ca "o functie a clasei" si nu ca "o functie a unui obiect". Putem avea functii ale claselor, dar nu putem avea variabile ale claselor. De fapt, in momentul unui astfel de apel nu se creeaza nici un obiect care este instanta a clasei respective. Ca urmare, o functie a unei clase nu poate opera asupra unor proprietati ale clasei, dar poate utiliza variabile locale sau globale. In plus, o astfel de functie nu poate utiliza pseudo-variabila $this. In exemplul anterior, in cadrul clasei B este redefinita functia exemplu ( ). Asadar, definitia "originala" (din cadrul clasei A) nu poate fi accesata in interiorul clasei B decat daca ne referim la ea explicit prin intermediul operatorului ::.

Accesarea clasei de baza
In exemplul anterior am utilizat o functie a clasei de baza. In locul utilizarii denumirii clasei de baza poate fi folosita denumirea speciala parent care este o referinta la clasa de baza definita in cadrul constructiei extends. Folosirea denumirii speciale este utila in cazul in care ierarhia de clase se modifica. In acest caz este suficienta o singura modificare in cadrul constructiei extends, fara a mai fi necesare modificari in interiorul clasei derivate. Asadar, definitia clasei B poate fi rescrisa astfel:
class B extends A {
function exemplu ( ) {
echo "Functia redefinita<br>\n";
parent :: exemplu ( );
}
}


Serializarea obiectelor
Prin serializare se intelege crearea unui sir de octeti care contine reprezentarea interna (binara) a variabilei respective. Asadar, serializarea permite "salvarea" valorilor unei variabile. Daca este serializat un obiect sunt salvate doar proprietatile acestuia (variabilele membre) si numele clasei din care face parte, nu si metodele deoarece functiile nu reprezinta valori. Pentru a serializa un obiect este utilizata functia serialize ( ) care returneaza sirul de octeti care contine reprezentarea binara. Pentru a deserializa un obiect se foloseste functia pereche unserialize ( ). Pentru ca o astfel de operatie sa functioneze corect este necesara definirea clasei din care face parte obiectul respectiv. Functia returneaza valoarea variabilei serializate. In exemplul urmator aveti prezentat modul in care poate fi serializat si deserializat un obiect. sirul de octeti obtinut in urma serializarii va fi scris intr-un fisier si va fi citit din fisierul respectiv pentru efectuarea deserializarii. De obicei serializarea si deserializarea sunt realizate in documente php diferite deoarece aeste operatii nu au aproape nici o utilitate daca sunt folosite in cadrul aceluiasi document. Primul document in care se realizeaza serializarea trebuie sa contina o secventa asemanatoare cu urmatoarea:
class A {
var $msg = "Salutare lume";
function scrie ( ) {
echo $this -> msg;
}
}
$a = new A;
$s = serialize ($a);
// salvarea sirului intr-un fisier
$fp = fopen ("fisier", "w");
fputs ($fp, $s);
fclose ($fp);

Pentru deserializare al doilea document va contine urmatoarea secventa:
class A {
var $msg = "Salutare lume";
function scrie ( ) {
echo $this -> msg;
}
}
// citirea sirului din fisier
$s = implode ("", @file ("fisier"));
$a = unserialize ($s);
// dupa deserializare obiectul poate fi folosit
$a -> show_one ( );

Referintele pot fi utilizate pentru a accesa continutul unei variabile folosind mai multe nume. Spre deosebire de limbajul C, in PHP referintele nu sunt pointeri, ci alias-uri intr-o tabela de simboluri. In PHP denumirile variabilelor si continutul acestora nu sunt unul si acelasi lucru. Asadar este posibil ca acelasi continut sa aiba denumiri diferite.

Utilizarea referintelor
Referintele PHP permit unor variabile cu denumiri diferite sa corespunda unui acelasi continut. Cu alte cuvinte, instructiunea $a = &$b are ca efect faptul ca $a si $b refera aceeasi variabila. In aceasta situatie $a si $b au acelasi statut. Nu se poate spune ca $a refera $b sau invers. O alta posibilitate de utilizare a referintelor este transmiterea prin referinta a parametrilor unei functii. Efectul unei astfel de transmisii este crearea unei variabile locale care refera spre acelasi continut ca variabila din contextul apelant. Sa luam in considerare urmatorul exemplu:
function inc (&$var) {
$var++
}
$a = 5;
inc ($a);

Initial valoarea variabilei $a este 5. Dupa apel variabila locala $var si variabila din contextul apelant $a indica spre acelasi continut. Valoarea pastrata in locatia de memorie respectiva este incrementata (devine 6) prin intermediul instructiunii $var++;. Datorita faptului ca cele doua variabile au acelasi continut, valoarea variabilei $a va fi 6 dupa executarea functiei. Un parametru transmis prin referinta poate fi:
- o variabila;
- o instructiune new;
- o referinta returnata de o functie.
Daca unei astfel de functii i se transmite ca parametru un alt tip de expresie rezultatul este nedefinit. Asadar, pentru o functie care are un parametru transmis prin referinta nu se poate folosi o constanta in momentul apelului. De exemplu, pentru functia inc ( ) prezentata anterior nu este permis un apel de forma inc (5).

Referinte globale
In momentul declararii unei variabile globale (printr-o instructiune de tipul global $var) se creeaza de fapt o referinta spre o variabila globala. Cu alte cuvinte, aceasta instructiune este echivalenta cu $var = &$GLOBALS ["var"];.

Referinta $this
In cadrul unei metode a unui obiect $this este intotdeauna o referinta spre obiectul care utilizeaza functia (obiectul curent).





Link-ul autorului:
www.tutoriale.far-php.ro

Comentarii




Voteaza acest articol!
 



Trimite un comentariu!

Nume *
E-mail *
Comentariu *
  Vreau sa fiu anuntat de urmatoarele mesaje la acest articol

Security image

Fanache A. Remus

www.farsoft.far-php.ro - portofoliu
http://www.farsoft.far-php.ro

Cloud tag

tutorial, photoshop, html, css, javascript, flash, php, mysql, grafica 3D, tutorial, coduri, scripturi, generator de coduri, cursuri php