๑۩۞۩๑ » WEBTOOLS « ๑۩۞۩๑
WEBTOOLS FORUM - RECOMMENDED SETTINGS/SETARI RECOMANDATE: BROWSER=MOZILLA FIREFOX OR IE REZOLUTION=1280x1024| FORUMUL ESTE IN PLINA DEZVOLTARE VA RUGAM SA NE AJUTATI! ► DATA INFIINTARII: 19-07-2008 ►
Lista Forumurilor Pe Tematici
๑۩۞۩๑ » WEBTOOLS « ๑۩۞۩๑ | Inregistrare | Login

POZE ๑۩۞۩๑ » WEBTOOLS « ๑۩۞۩๑

Nu sunteti logat.
Nou pe simpatie:
inna_90 pe Simpatie
Femeie
23 ani
Vrancea
cauta Barbat
30 - 48 ani
๑۩۞۩๑ » WEBTOOLS « ๑۩۞۩๑ / » TURORIALE PHP « / Clase şi obiecte īn PHP Moderat de AndreyNek, MadaLino
Autor
Mesaj Pagini: 1
MadaLino
Moderator

Din: Hotel Paradis
Inregistrat: acum 17 ani
Postari: 240
O clasă este o colecţie de variabile şi funcţii care operează asupra variabilelor respective. Sintaxa folosită pentru declararea unei clase īn PHP este:


Cod:

<?php
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 īn PHP cu o singură excepţie: sdtclass; acest identificator este folosit de PHP īn scopuri interne.
Īn PHP funcţiile ale căror identificatori īncep cu _ sunt considerate funcţii magice şi utilizarea acestora nu este recomandată.
Īn PHP, datele membre nu pot fi iniţializate decāt cu valori constante. Pentru a iniţializa variabilele cu valori care nu sunt constante trebuie folosit un constructor. Mai jos aveti un exemplu de clasă īn care initializările nu sunt corecte:


Cod:

<?php
class Nepermis
    {
    var $data = date("Y-m-d";
    var $nume = $prenume;
    var $dest = 'Mihai '.'Claudiu';
    var $obiecte = array ("minge", "pantof";
    }
?>


Obiecte

Īn PHP clasele sunt considerate a fi tipuri de date; ele pot fi privite ca fiind "amprentele" variabilelor propriu-zise. Pentru a crea o variabilă al cărei tip este o clasă trebuie utilizat operatorul new. Īn continuare vom defini o clasă Aritmetica cu două date membre x şi y care sunt numere īntregi şi două metode care realizează adunarea, respectiv īnmulţirea lor.


Cod:

<?php
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 instrucţiune de tipul:

$aritm = new Aritmetica;

Acum putem utiliza metodele clasei; pentru a afişa suma sau produsul celor două numere vom putea apela cele două metode astfel:

echo $aritm -> Suma ( );
echo $aritm -> Produs ( );

Vom obţine rezultatele 5, respectiv 6. Valorile datelor membre pot fi şi ele modificate prin instrucţiuni de tipul:

$aritm -> x = 5;
$aritm -> y = 4;

Dacă, īn urma modificării apelam din nou metodele Suma( ) şi Produs( ), rezultatele vor fi 9, respectiv 20.



Cod:

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


Rezultatul codului de mai sus este:

Salut PHP4!

Īn acest exemplu a fost utilizată pseudo-variabila $this. Aceasta este folosită pentru a indica faptul că se operează asupra unei date membre a obiectului curent.


Extinderea claselor

Deseori este necesară definirea unor clase cu proprietăţi (date membre) şi metode asemănătoare. Pentru a usura definirea unor astfel de clase a fost introdus conceptul de extindere (derivare) a claselor.
O clasă derivată va păstra toate proprietăţile şi metodele clasei pe care o extinde şi poate conţine diferite proprietăţi şi metode noi. Nu există nici o posibilitate de a elimina din clasa derivată anumite proprietăţi sau metode ale clasei de bază. O anumită clasă poate avea o singură clasă părinte; aşadar, īn PHP nu este permisă moştenirea multiplă. Pentru a extinde o anumită clasă se utilizează cuvāntul cheie extends.
�n următorul exemplu voi extinde clasa Aritmetica; o să adaug īncă o variabilă şi o să crez două noi funcţii: una pentru calculul sumei celor trei variabile şi una pentru calcularea produsului lor:


Cod:

<?php
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;
        }
    }
?>


Dacă definim un obiect prin intermediul unei instrucţiuni de genul:

$aritm3 = new Aritmetica3;

atunci pentru acest obiect vom putea utiliza atāt metodele definite īn cadrul clasei Aritmetica3: Suma3( )şi Produs3( ), cāt şi metodele definite īn cadrul clasei de bază Aritmetica: Suma( )şi Produs( ).
Īn continuare aveţi un exemplu care ilustrează modul īn care pot fi create şi utilizate clasele derivate.


Cod:

<?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>";
?>


Rezultatul codului de mai sus este:



Citat:

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


Īn PHP clasele trebuie definite īnaintea utilizării lor; aşadar clasa părinte va fi definită īntotdeauna īnaintea clasei fiu.


Constructori

Un constructor este o metodă (funcţie) a unei clase care este apelată automat īn momentul īn care este creată o nouă instanţă a clasei (cu ajutorul operatorului new). Īn PHP, este considerată ca fiind un constructor, orice funcţie care are acelaşi nume cu clasa īn interiorul căreia este definită.
Constructorii pot fi folosiţi pentru iniţializarea datelor membre cu valori care nu sunt constante. Ei pot avea argumente, iar acestea pot fi optionale. Pentru a putea utiliza clasa fără a specifica nici un parametru īn momentul creării unui obiect, se recomandă stabilirea unor valori implicite pentru toate argumentele constructorului. Īn cazul īn care nu este definit un constructor pentru o anumită clasă, se utilizează constructorul clasei de bază, dacă aceasta există. De exemplu, pentru următoarea secvenţă de cod, īn momentul creării obiectului corespunzător variabilei $b, va fi apelat constructorul clasei A.


Cod:

<?php
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>";
        }
    }
?>


Īn PHP apelul constructorului clasei de bază trebuie să fie explicit dacă este necesară executarea operaţiilor corespunzătoare. Īn majoritatea limbajelor de programare există funcţii speciale numite destructori care sunt apelate automat īn momentul "distrugerii" unui obiect. Īn PHP nu există destructori.


Operatorul ::

Uneori este utilă folosirea unor metode sau variabile ale clasei de bază sau ale unei clase care nu a fost instanţiată īncă. Īn acest scop a fost introdus operatorul ::
Pentru a descrie modul de utilizare al acestui operator voi prezenta mai īntāi un exemplu:


Cod:

<?php
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();
$b = new B;
?>


Prin intermediul instrucţiunii

A :: exemplu( );

este apelată metoda exemplu( ) a clasei A, aşadar se afişează mesajul 'Functia clasei de baza' cu toate că nu există nici un obiect care este o instanţă a acestei clase, deci nu putem scrie o instrucţiune de tipul $a -> exemplu( );
Īn schimb apelăm metoda

$b -> exemplu( );

ca "o funcţie a clasei" şi nu ca "o funcţie a unui obiect". Putem avea funcţii ale claselor, dar nu putem avea variabile ale claselor. De fapt, īn momentul unui astfel de apel nu se creeaza nici un obiect care este instanţă a clasei respective. Ca urmare, o funcţie a unei clase nu poate opera asupra unor proprietăţi ale clasei, dar poate utiliza variabile locale sau globale. Īn plus, o astfel de funcţie nu poate utiliza pseudo-variabila $this.
Īn exemplul anterior, īn cadrul clasei B este redefinită funcţia exemplu( ). Aşadar, definiţia "originală" (din cadrul clasei A) nu poate fi accesată īn interiorul clasei B decāt dacă ne referim la ea explicit prin intermediul operatorului ::.


Accesarea clasei de baza

Īn exemplul anterior am utilizat o funcţie a clasei de bază. Īn locul utilizării denumirii clasei de baza poate fi folosită denumirea specială parent care este o referinţă la clasa de bază definită īn cadrul construcţiei extends. Folosirea denumirii speciale este utilă īn cazul īn care ierarhia de clase se modifică. Īn acest caz este suficientă o singură modificare īn cadrul construcţiei extends, fără a mai fi necesare modificări īn interiorul clasei derivate. Aşadar, definiţia clasei B poate fi rescrisă astfel:


Cod:

<?php
class B extends A
    {
    function exemplu()
        {
        echo "Functia redefinita<br>\n";
        parent :: exemplu();
        }
    }
?>


Serializarea obiectelor

Prin serializare se īnţelege crearea unui şir de octeţi care conţin reprezentarea internă (binară a variabilei respective. Aşadar, serializarea permite "salvarea" valorilor unei variabile. Dacă este serializat un obiect sunt salvate doar proprietăţile acestuia (variabilele membre) şi numele clasei din care face parte, nu şi metodele, deoarece funcţiile nu reprezintă valori.
Pentru a serializa un obiect este utilizată funcţia serialize( ) care returnează şirul de octeţi care conţine reprezentarea binară.
Pentru a deserializa un obiect se foloseşte funcţia pereche unserialize( ).
Pentru ca o astfel de operaţie să funcţioneze corect este necesară definirea clasei din care face parte obiectul respectiv. Funcţia returnează valoarea variabilei serializate. Īn exemplul următor aveţi prezentat modul īn care poate fi serializat şi deserializat un obiect. Şirul de octeţi obţinut īn urma serializării va fi scris īntr-un fişier şi va fi citit din fişierul respectiv pentru efectuarea deserializării. De obicei serializarea şi deserializarea sunt realizate īn documente php diferite deoarece aeste operaţii nu au aproape nici o utilitate dacă sunt folosite īn cadrul aceluiaşi document. Primul document īn care se realizează serializarea trebuie să conţină o secvenţă asemănătoare cu următoarea:


Cod:

<?php
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 conţine următoarea secvenţă:


Cod:

<?php
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();
?>


Referinţele pot fi utilizate pentru a accesa conţinutul unei variabile folosind mai multe nume. Spre deosebire de limbajul C, īn PHP referinţele nu sunt pointeri, ci alias-uri īntr-o tabela de simboluri. Īn PHP denumirile variabilelor şi conţinutul acestora nu sunt unul şi acelaşi lucru. Aşadar este posibil ca acelaşi conţinut să aibă denumiri diferite.


Utilizarea referinţelor

Referinţele PHP permit unor variabile cu denumiri diferite să corespundă unui acelaşi conţinut. Cu alte cuvinte, instrucţiunea

$a = &$b

are ca efect faptul că $a şi $b referă aceeaşi variabilă. Īn această situaţie $a şi $b<;/em> au acelaşi statut. Nu se poate spune că $a referă $b sau invers. O altă posibilitate de utilizare a referinţelor este transmiterea prin referinţă a parametrilor unei funcţii. Efectul unei astfel de transmisii este crearea unei variabile locale care referă spre acelaşi conţinut ca variabila din contextul apelant. Să luăm īn considerare următorul exemplu:


Cod:

<?php
function inc(&$var)
    {
    $var++;
    }

$a = 5;
inc($a);
?>


Iniţial valoarea variabilei $a este 5. După apel variabila locală $var şi variabila din contextul apelant $a indică spre acelaşi conţinut. Valoarea păstrată īn locaţia de memorie respectivă este incrementată (devine 6) prin intermediul instrucţiunii $var++;.
Datorită faptului că cele două variabile au acelaşi conţinut, valoarea variabilei $a va fi 6 după executarea funcţiei.
Un parametru transmis prin referinţă poate fi:
- o variabilă;
- o instrucţiune new;
- o referinţă returnată de o funcţie.
Dacă unei astfel de funcţii i se transmite ca parametru un alt tip de expresie rezultatul este nedefinit. Aşadar, pentru o funcţie care are un parametru transmis prin referinţă nu se poate folosi o constantă īn momentul apelului. De exemplu, pentru funcţia inc( ) prezentată anterior nu este permis un apel de forma inc(5).


Referinţe globale

Īn momentul declarării unei variabile globale (printr-o instrucţiune de tipul global $var) se creează de fapt o referinţă spre o variabilă globală. Cu alte cuvinte, această instrucţiune este echivalentă cu $var = &$GLOBALS ["var"];.


Referinţa $this

Īn cadrul unei metode a unui obiect $this este īntotdeauna o referinţă spre obiectul care utilizează funcţia (obiectul curent).


_______________________________________


" Cui nu-i place cum gandesc multa    ii doresc ! "



pus acum 17 ani
   
Pagini: 1  

Mergi la