Documente Academic
Documente Profesional
Documente Cultură
OOP (Object Oriented Programming - Programare Orientata pe obiecte) este un concept (sau tehnica) de programare care
trateaza datele si functiile ca obiecte. Important la acest concept este sa fie inteleasa bine diferenta dintre Clasa (Class)
si Obiect (Object).
Inainte de a trece la lucruri practice, iata cate ceva teoretic despre OOP.
Clasa este o structura de date compacta, care contine variabile (numite proprietati) si functii (numite metode) prin care se pot
crea diferite instructiuni legate intre ele in acea structura.
Obiectele sunt elementele din script create cu o clasa, si prin care se pot folosi proprietatile si metodele din acea clasa.
- De exemplu, pentru a intelege mai bine, prin analogie, o Clasa poate fi asemanata cu planul /schita unei case, iar obiectul este
insasi casa, si contine proprietatile (culoare, ferestre, etc.) definite in schita. Precum, folosind acelasi plan se pot construi mai
multe case, asa si in OOP, folosind aceeasi clasa se pot crea unul sau mai multe obiecte prin care se aplica in script proprietatile si
functiile definite in clasa.
Practic, o clasa este o "fabrica" de obiecte, prin care se creaza obiecte cu aceeasi structura, avand proprietati si metode identice. Fiecare
astfel de obiect creat poarta denumirea de Instanta a clasei.
In OOP (Programarea Orientata pe Obiect) apar termenii: "Encapsulation" (Encapsulare), "Inheritance" (Mostenire) si
"Polymorphism" (polimorfism.).
- Encapsularea reprezinta faptul de a utiliza proprietatile si metodele clasei fara a fi necesara cunoasterea sructurii ei. Astfel,
cine foloseste o clasa intr-un script nu are nevoie sa cunoasca structura codului si instructiunilor din ea.
- Mostenirea e abilitatea unei clase de a folosi proprietati si functii definite in alta clasa din care este extinsa
(denumita parinte).
- Polimorfismul e abilitatea unei clase de a face mai multe lucruri, diferite, sau de a utiliza o clasa sau alta pentru a realiza
lucrul dorit, avand functii similare. De exemplu, o rigla poate fi utilizata pentru a trasa linii dar si pt. a masura ceva, iar pentru a
trasa linii se poate folosi si alta rigla dreapta. Acesta e polimorfism.
Pentru cine este obijnuit cu modul de creare a claselor in PHP 4, incepand de la versiunea PHP 5 sunt unele schimbari de sintaxa:
- Proprietatile nu se mai declara cu var
- Metoda Constructor se defineste cu numele __construct
1. Creare clasa
Definirea unei clase incepe cu un cuvantul cheie "class", urmat de numele clasei si corpul ei (cuprins intre acolade). In corpul
clasei se definesc proprietatile si metodele ei.
- Proprietatile sunt variabile definite in interiorul clasei.
- Metodele sunt functii create in interiorul clasei.
Structura general de alcatuire a unei clase este urmatoarea:
class nume_clasa {
$proprietate;
function metoda() {
// Codul functiei
}
}
Pentru a construi o clasa profesionala, cu elemente incluse in PHP 5+, sunt necesare si alte lucruri care trebuie adaugate.
- La definirea unei clasei si a elementelor din ea (proprietati, metode) se pot aplica unele atribute speciale prin care se defineste
domeniul lor de lucru (de existenta). Acest atribut se adauga inaintea variabilei sau a cuvantului functions, si poate fi unul din
cuvintele:
class Nume_Clasa {
atribut $proprietate1;
atribut $proprietate2;
.................
atribut function metoda1() {
// Codul functiei
}
atribut function metoda2() {
// Codul functiei
}
.................
}
- Pentru o mai buna organizare, este indicata crearea fiecarei clase intr-un fisier PHP separat si cu o denumire de forma
"class.Nume_Clasa.php". Acest lucru nu e obligatorriu, doar ca indicatie; clasa poate fi creata si in scriptul unde e folosita.
Iata un exemplu de clasa simpla, ce contine doua proprietati, prima cu atribut public (denumita $site), a doua private(denumita
$categorie) si o metoda cu atribut public (cu numele "pagini").
Exemplu SiteClas
<?php
// Se defineste clasa SiteClas
class SiteClas {
// Proprietatea publica
// Proprietate privata
2. Utilizare clasa
Dupa ce o clasa e creata, pentru a putea fi utilizata trebuie creata o instanta de obiect a clasei. Aceasta instanta se declara in
scriptul PHP, cu formula:
$nume_obiect = new Nume_Clasa();
- "nume_obiect" este numele obiectului prin care pot fi utilizate proprietatile si metodele acelei clase.
Iata cum poate fi utilizata clasa "SiteClas" prezentata mai sus (pt. explicatii, studiati si comentariile din cod).
<?php
include('class.SiteClas.php');
echo $objSite->site;
// Include clasa
3. Metoda constructor
Metoda constructor e un tip special de functie din interiorul Clasei. Se declara cu numele __construct (doua caractere "_" in
fata). Aceasta metoda este mereu "public" chiar daca nu se mentioneaza special atributul "public". Diferenta fata de celelalte
functii este aceea ca Metoda Constructor e apelata automat cand se creaza o instanta la clasa respectiva, codul din ea se executa
in momentul cand e creat obiectul (cu new).
Iata o noua versiune a clasei "SiteClas", care include si metoda constructor, plus o metoda cu atribut protected.
<?php
// Se defineste clasa SiteClas
class SiteClas {
public $site = 'www.marplo.net/';
// Proprietate publica
// Proprietate privata
// Metoda protected
protected function Mesaj() {
// Returneaza un mesaj cu proprietatea 'categorie'
return 'Categoria de cursuri '. $this->categorie;
}
// Creare metoda, preia un argument
public function pagini($pag) {
// Afiseaza adresa URL formata din valoarea celor 2 proprietati si argumentul primit
echo '<br />'. $this->site. $this->categorie. $pag;
}
}
?>
- Deoarece Metoda Constructor preia un parametri ($nume) [se pot adauga mai multi, ca la orice functie], cand se creaza o instanta
la aceasta clasa trebuie sa fie adaugat si un argument.
<?php
include('class.SiteClas.php');
// Include clasa
Daca metoda constructor e definita cu un anumit numar de parametri, fara valoare initiala, cand se creaza instanta de obiect,
clasa trebuie sa fie apelata cu acelasi numar de argumente, altfel returneaza eroare.
De ex., metoda constructor din exemplu precedent e definita cu un parametru ($nume), daca s-ar crea o instanta fara argument, de
forma: $obj = new SiteClass(), va genera o eroare de genul:
1. Metoda Accesor
Variabilele (proprietatile) create intr-o clasa pot avea de la inceput o valoare sau pot fi doar simplu declarate, urmand ca
valoarea lor sa fie atribuita prin intermediul unei functii (metode). Aceasta functie e denumita genericMetoda Accessor, e la fel
ca oricare alta metoda, doar ca scopul ei este de a atribui valori proprietatilor; in rest, se construieste si se apeleaza la fel ca
celelalte.
Ca sa vedeti cum functioneaza "metoda accessor", incercati urmatorul exemplu, in care este creata o clasa "SiteClas" cu doua
proprietati ('site' si 'categorie'), ambele fara valoare, iar metoda Constructor e folosita si ca accesor, atribuie valori proprietatilor
prin parametri ei.
<?php
// Se defineste clasa SiteClas
class SiteClas {
public $site;
private $categorie;
// Constructor
public function __construct($site, $categorie) {
// Atribuie proprietatilor valoarea din parametri
$this->site = $site;
$this->categorie = $categorie;
}
// Afiseaza un sir cu adresa URL, www., valoarea celor 2 proprietati si argumentul primit
echo '<br />www.'. $this->site.'/'. $this->categorie.'/'. $pag;
}
}
?>
- Cand e creata instanta de obiect la clasa, metoda constructor (care se executa automat) atribuie proprietatilor "site" si "categorie"
valorile din parametri, care trebuie adaugate la crearea instantei.
- Metoda pagini(), cand e apelata, afiseaza o adresa URL formata din valoarea proprietatilor "site", "categorie" (atribuite prin
constructor) si argumentul ei $pag.
- Salvam clasa intr-un fisier denumit "class.SiteClass.php", iar pentru test, se adauga urmatorul cod intr-un fisier .php salvat in
acelasi director unde e si clasa.
<?php
include('class.SiteClas.php');
// Include clasa
$objSite->pagini('oop-clase-obiecte.html');
?>
- Dupa executie, in browser va afisa:
www.marplo.net/php-mysql/oop-clase-obiecte.html
Valoarea proprietatii "site", avand atribut "public", poate fi modificata si pe parcurs in script, cu expresia:
$objSite->site = valoare;
Iata o alta versiune a clasei TestClas. Ambele proprietati sunt declarate "private", ca sa nu fie modificate in mod direct in afara
clasei. Valorile initiale le primesc la crearea instantei (prin constructor). Pentru a putea accesa si modifica proprietatea "categorie" in
script, se creaza special cate o metoda accesor: getCategorie() si setCategorie() (vedeti si explicatiile din cod).
<?php
// Se defineste clasa SiteClas
class SiteClas {
// Definire proprietati private, fara valoare
private $site;
private $categorie;
// Constructor
public function __construct($site, $categorie) {
// Include clasa
$objSite->pagini('introducere.html');
?>
- In browser scriptul va afisa:
php-mysql
www.marplo.net/html/introducere.html
- "php-mysql" este valoarea initiala data proprietatii "categorie" prin crearea instantei la clasa. Dar prin modificarea ei cu $objSite>setCategorie('html');, metoda pagini() va utiliza proprietatea "categorie" cu aceasta valoare (html).
3. Metoda Destructor
Metoda Destructor se creaza cu numele __destruct (doua caractere '_' la inceput). Aceasta metoda este opusul
lui __construct. Daca metoda constructor e apelata automat cand se creaza o instanta de obiect la clasa, metoda Destructor se
apeleaza automat cand e stearsa, cu unset(), instanta la acea clasa.
Se intelege mai bine din urmatorul exemplu. Clasa Test de mai jos contine o proprietate privata, "nume", o metoda accesor
"setNume()", metoda constructor si destructor.
<?php
// Clasa Test
class Test {
private $nume;
// Constructor
public function __construct($nume) {
// Atribuie proprietatii 'nume' valoarea din parametru
// si afiseaza un mesaj
$this->nume = $nume;
echo 'Bine ai venit '. $this->nume. '<br />';
}
// Metoda Destructor
function __destruct() {
echo 'Cu bine '. $this->nume;
}
}
?>
- Ca sa testam efectul metodei __destruct, se foloseste urmatorul script (vedeti explicatiile din cod).
<?php
// Creare instanta de obiect la clasa Test
$obj = new Test('Mar');
unset($obj);
?>
- Prin argumentul 'Mar' adaugat la crearea instantei, metoda constructor atribuie aceasta valoare proprietatii "nume", pe care o
afiseaza in mesajul returnat.
- Apelarea metodei setNume() modifica valoarea acestei proprietati, iar cand instanta de obiect e stearsa, cuunset($obj), se
autoapeleaza metoda "__destruct" si determina executia codului din ea, care va afisa alt mesaj, cu proprietatea "nume" avand
ultima valoare setata.
- Rezultatul afisat in browser este:
Bine ai venit Mar
Cu bine Plo
Metoda destructor este utila cand se doreste executarea automata a unor ultime instructiuni cand instanta la clasa e stearsa din
memorie prin apelarea functiei PHP unset().
1. Constante
Pe langa proprietati (variabile) si metode (functii), in corpul clasei pot fi definite si constante, prin cuvantul const. Sintaxa
generala este:
const NUME_CONSTANTA;
- Diferenta principala dintre constante si proprietati e faptul ca valoarea constantei ramane aceeasi, nu mai poate fi modificata.
- La constante nu se foloseste atribut (public, private, protected), doar cuvantul const, ele sunt recunoscute ca publice.
- Constantele se acceseaza prin numele clasei si operatorul doua-puncte (::) (atat in interiorul clasei cat si in script unde e creata
instanta), cu formula:
Nume_Clasa::NUME_CONSTANTA
Pentru a se distinge mai clar proprietatile de constante, se obisnueste ca numele constantelor sa fie scris cu majuscule.
Iata un exemplu de clasa cu o constanta, si cum poate fi aceasta utilizata. Clasa Test de mai jos contine o proprietate "raza", o
constanta "PI", metoda constructor si o metoda "getArea()".
<?php
// Clasa Test
class Test {
public $raza;
const PI = 3.14;
// Proprietate
// Constanta
// Constructor
public function __construct($raza) {
// Daca $raza e un numar, atribuie valoarea la proprietatea "raza"
// Altfel, seteaza un mesaj de eroare
if(is_numeric($raza)) $this->raza = $raza;
else throw new Exception('Valoare incorecta pt. raza');
}
// Privata
// Publica
// Constructor
public function __construct($site) {
// Daca parametru $site e de tip String si cel putin 4 caractere
// Atribuie valoarea la proprietatea "site" si apeleaza metoda getProp()
// Altfel, seteaza un mesaj de eroare
if(is_string($site) && strlen($site)>3) {
elStatic::$site = $site;
self::getProp();
}
else throw new Exception('Valoare incorecta pt. site');
}
// Metoda statica
static public function getProp() {
// Afiseaza valoarea proprietatilor statice (folosind numele clasei, dar si cuvantul self )
echo '<br /> ID = '. elStatic::$id. ' - site: '. self::$site;
}
}
?>
- Vedeti explicatiile din cod si modul de lucru, cum sunt accesate proprietatile si metoda statica.
- Deoarece elementele statice apartin direct clasei, pentru utilizarea lor nu e nevoie de crearea unei instante la aceasta clasa. Dar se
pot folosi si instante, acestea determina auto-apelarea metodei constructor, dupa cum puteti vedea in scriptul urmator, care
foloseste elemente din clasa "elStatic" si o instanta la ea.
<?php
echo elStatic::$id;
elStatic::getProp();
elStatic::$id = 89;
La pagina Functii - clase si obiecte sunt prezentate cateva functii PHP pentru Clase si Obiecte.
In lectia urmatoare e prezentata utilizarea mostenirii si clasele extinse.
Mostenirea este unul din cele mai utile instrumente ale Programarii Orientate pe Obiect - OOP.
Prin mostenire se intelege transmiterea proprietatilor, constanttelor si a functiilor de la o clasa la alta, intr-o structura ierarhica.
Prima clasa este clasa de baza, denumita "parinte", legata de aceasta se poate crea o sub-clasa, denumita "copil"; sub-clasa
'copil' mosteneste proprietatile si metodele clasei 'parinte' (cele care sunt cu atribut "public" sau "protected"), le poate folosi in
instructiunile din propriul cod si le transmite cand se creaza o instanta de obiect la ea.Precum in natura copii mostenesc genele
parintilor.
// Constructor
public function __construct($site) {
// Daca parametru $site e un Sir cu cel putin 5 caractere, atribuie valoarea la proprietatea "site"
// Metoda getPag()
public function getPag($pag) {
// Defineste si returneaza adresa URL a paginii
$url = $this->site. '/'. $this->categorie. '/'. $pag;
return $url;
}
}
?>
- Metoda Constructor atribuie valoarea din parametru $site la proprietatea "site".
- Metoda getPag() returneaza o adresa URL formata din proprietatile clasei si parametru ei.
Salvam aceasta clasa intr-un fisier "class.Site.php".
Aceasta clasa poate fi utilizata pentru afisarea unui sir cu o adresa URL, prin apelarea metodei getPag(). Daca vrem sa obtinem
aceasta adresa intr-un tag HTML tip link (<a>) se poate crea o noua metoda, pentru alta facilitate alta metoda, si tot asa se
aglomereaza codul clasei, fapt ce devine o problema in cazul unor clase mari. O alta varianta este crearea unei sub-clase extinse din
aceasta. Sub-clasa (copil) are abilitatea de a mosteni /utiliza toate proprietatile si metodele definite ca publice si protected in clasa
de baza (parinte) ca si cum ar fi create in ea (fara sa mai fie scrise inca o data). Astfel, in clasa copil se creaza doar instructiunile cu
noua functie pe care o dorim, si nici nu mai trebuie modificata clasa parinte.
In continuarea acestui exemplu se creaza o alta clasa, denumita LinkSite, ca extindere a clasei Site. Ea contine doar o metoda
getLink() pentru afisarea unui link.
<?php
include('class.Site.php');
// Proprietate
}
}
?>
- Prin crearea in aceasta sub-clasa a metodei "__construct()" se anuleaza efectul celei din clasa parinte, si neavand parametru, nici
la creare instantei nu se mai adauga vreun argument.
- Pentru a pastra si functionalitatea initiala (din clasa parinte) a metodei rescrise, in corpul functie care face rescrierea, se adauga cu
formula parent::nume_metoda() (tehnica folosita si in exemplu de sus, la getPag()).
In scriptul urmator se foloseste aceasta a doua sub-clasa.
<?php
include('class.PagSite.php');
3. Metode fi nale
In exemplu prezentat mai sus se vede cum o metoda din clasa de baza poate fi rescrisa in sub-clasa copil, dandu-i alta
functionalitate. Sunt situatii in care nu se doreste ca o metoda sa poata fi rescrisa, in acest caz, prin adaugarea cuvantului final la
inceputul declararii metodei se blocheaaaza posibilitatea rescrierii ei.
- De exemplu:
<?php
// Clasa Baza
class Baza {
// Metoda final
final public function numeMet() {
// Instructiunile functiei
}
}
4. Clase fi nale
Precum metodele declarate cu "final" nu mai pot fi modificate in sub-clasa copil, asa se pot crea si clase care sa ramana fixe,
fara sa se poata crea din ele alta sub-clasa. Acest lucru se obtine prin adaugarea cuvantului final inainte de class.
- De exemplu:
<?php
// Clasa Baza
final class Baza {
// ... Instructiuni
}
// Constructor
public function __construct($site) {
// Daca parametru $site e un Sir cu cel putin 5 caractere, atribuie valoarea la proprietatea "site"
// Altfel, seteaza un mesaj de eroare
if(is_string($site) && strlen($site)>4) $this->site = $site;
else throw new Exception('Valoare incorecta pt. site');
}
// Metoda getPag()
public function getPag($pag) {
// Defineste si returneaza adresa URL a paginii
$url = $this->site. '/'. $this->categorie. '/'. $pag;
return $url;
}
}
?>
- Metoda Constructor atribuie valoarea din parametru $site la proprietatea "site".
- Metoda getPag() returneaza o adresa URL formata din proprietatile clasei si parametru ei.
Salvam aceasta clasa intr-un fisier "class.Site.php".
Aceasta clasa poate fi utilizata pentru afisarea unui sir cu o adresa URL, prin apelarea metodei getPag(). Daca vrem sa obtinem
aceasta adresa intr-un tag HTML tip link (<a>) se poate crea o noua metoda, pentru alta facilitate alta metoda, si tot asa se
aglomereaza codul clasei, fapt ce devine o problema in cazul unor clase mari. O alta varianta este crearea unei sub-clase extinse din
aceasta. Sub-clasa (copil) are abilitatea de a mosteni /utiliza toate proprietatile si metodele definite ca publice si protected in clasa
de baza (parinte) ca si cum ar fi create in ea (fara sa mai fie scrise inca o data). Astfel, in clasa copil se creaza doar instructiunile cu
noua functie pe care o dorim, si nici nu mai trebuie modificata clasa parinte.
In continuarea acestui exemplu se creaza o alta clasa, denumita LinkSite, ca extindere a clasei Site. Ea contine doar o metoda
getLink() pentru afisarea unui link.
<?php
include('class.Site.php');
- Observati cum sunt accesate proprietatea "categorie" si metoda "getPag()" (care se afla in clasa parinte), prin instanta de obiect la
clasa copil (LinkSite) ca si cum ar fi create in ea. Acesta este efectul mostenirii, atat de util in OOP.
In browser va afisa urmatorul rezultat:
Link
www.marplo.net/ajax/introducere.html
// Proprietate
3. Metode fi nale
In exemplu prezentat mai sus se vede cum o metoda din clasa de baza poate fi rescrisa in sub-clasa copil, dandu-i alta
functionalitate. Sunt situatii in care nu se doreste ca o metoda sa poata fi rescrisa, in acest caz, prin adaugarea cuvantului final la
inceputul declararii metodei se blocheaaaza posibilitatea rescrierii ei.
- De exemplu:
<?php
// Clasa Baza
class Baza {
// Metoda final
final public function numeMet() {
// Instructiunile functiei
}
}
4. Clase fi nale
Precum metodele declarate cu "final" nu mai pot fi modificate in sub-clasa copil, asa se pot crea si clase care sa ramana fixe,
fara sa se poata crea din ele alta sub-clasa. Acest lucru se obtine prin adaugarea cuvantului final inainte de class.
- De exemplu:
<?php
// Clasa Baza
final class Baza {
// ... Instructiuni
}
}
?>
__get($name) - E apelata automat cand se acceseaza o proprietate care nu exista. Preia numele ei in parametru $name.
__set($name, $value) - Se apeleaza automat cand se atribuie o valoare unei proprietati care nu exista. Preia numele ei
in parametru $name si valoarea in parametru $value.
Iata un exemplu din care se intelege mai bine rolul lor. O clasa in care sunt folosite aceste metode, se creaza o instanta de obiect la
ea apoi e accesata o proprietate inexistenta.
<?php
// Definire clasa AClas
class AClas {
// Proprietate care va retine valori atribuite unor proprietati nedeclarate
public $prop = array();
// Metoda magica __set() (pt. cand se atribuie valori unor proprietati nedefinite)
public function __set($name, $value) {
// Adauga in $prop element cu cheia $name si valoarea value
$this->prop[$name] = $value;
echo 'Proprietatea <b>'. $name. '</b> nu exista. S-a atribuit valoarea <i>'. $value. "</i> la proprietatea:
<b>prop['$name']</b><br />";
}
}
2. Metoda __call
Metoda magica __call() e creata pentru cazuri cand sunt apelate metode inexistente. Sintaxa ei este:
__call($nume, $array_argumente)
- $nume reprezinta numele metodei apelate
- in $array_argumente sunt retinute intr-un Array argumentele adaugate la apelarea metodei.
In urmatorul exemplu e definita o astfel de metoda "__call()" care afiseaza un mesaj cu numele metodei inexistente care a fost
apelata si argumentele transmise.
<?php
// Definire clasa AClas
class AClas {
// Metoda magica __call() (pt. apelari metode nedefinite)
public function __call($name, $args) {
// Afiseaza un mesaj cu numele metodei apelate si argumentele transmise
echo 'Metoda <b>'. $name. '</b> nu exista. Argumente: <i>'. implode(', ', $args). '</i>';
}
}
?>
- In browser va afisa:
Metoda site nu exista. Argumente: cursuri, tutoriale
Incepand cu PHP 3.0 e adaugata o metoda similara, __callStatic(), aceasta se executa automat cand e apelata o metoda statica
nedeclarata, prin formula: NumeClasa::metodaStatica()
3. Metoda __toString
Cu metoda __toString() se determina modul de reactie a clasei cand instanta de obiect la ea este folosita ca o variabila de tip
sir (String), de exemplu cu "echo".
In urmatorul exemplu e definita o clasa cu o metoda __construct() si una "__toString()" care afiseaza valoarea unei proprietati
"mesaj".
<?php
// Definire clasa AClas
class AClas {
private $mesaj;
// Proprietate
// Metoda Constructor
public function __construct($mesaj) {
// Atribuie valoarea din parametru la proprietatea "mesaj"
$this->mesaj = $mesaj;
}
}
}
?>
- In browser va afisa:
Fii bine primit
- Fara metoda __toString() adaugata in clasa, accesarea instantei de obiect simpla, cu "echo" sau "print" genereaza o eroare de
genul:
Catchable fatal error: Object of class AClas could not be converted to string in ...
Mai sunt si alte metode magice, mai putin folosite, cum ar fi: __isset (se apeleaza cand e verificata cu "isset()" o proprietate
inexistenta), __invoke (se executa cand instanta de obiect e apelata ca o functie), si altele; le puteti gasi la pagina oficiala
PHP.net Metode Magice
// Proprietate
}
?>
- Daca se creaza o instanta de obiect la aceasta clasa (de ex.: $obj = new Fructe();), va genera eroare de genul:
Fatal error: Cannot instantiate abstract class
- Metodele abstracte se creaza doar in clase abstracte.
- Rolul claselor si metodelor abstracte este acela de a crea un model minim de metode obligatorii care trebuie definite in sub-clase
normale derivate din ele (cu extends). Metodele abstracte definite in cea parinte trebuie create in orice clasa copil extinsa din cea
abstracta, cu acelasi numar de parametri (numele poate fi difereit).
De ex., orice sub-clasa extinsa din clasa Fructe (definita mai sus) trebuie sa contina metoda Stoc() cu un parametru, cum ar fi cea
din urmatorul exemplu, denumita Mere.
<?php
// Definire clasa copil, extinsa din cea abstracta
class Mere extends Fructe {
private $kg;
// Proprietate
// Afiseaza: 78 kg
?>
2. Interfaces
Ca rol, se poate spune ca Interface este asemanatoare cu clasa "abstract".
Clasa Interface este folosita ca tipar, sau template pentru clase cu functii similare, care trebuie sa respecte o anumita structura
de metode.
Sintetizat, Interface este o clasa cu o lista de metode obligatorii ce trebuie sa fie create in clasele unde este implementata. Toate
metodele specificate in "Interface" sunt cu atribut public si trebuie sa fie definite in clasele in care e aplicata, avand acelasi numar
de parametri cati sunt indicati in "Interface".
Creare interface
Clasa interface se creaza similar cu celelalte tipuri de clase. Diferenta e aceea ca la definirea ei, in loc de cuvantul "class" se
foloseste cuvantul "interface"; in plus, in corpul ei se scrie doar o lista cu metode publice fara, alt cod.
Sintaxa generala este urmatoarea:
interface numeInterfata {
public function numeMetoda();
public function altaMetoda()
...........
}
- La declararea metodelor in Interface nu se adauga acoladele sau codul lor, si nici alt atribut diferit de "public".
Iata un exemplu cu o Interface, denumita "ITest", in care sunt definite 2 metode: "Links()" si "Tutoriale()".
<?php
// Definire Interface ITest
interface ITest {
// Lista cu metode
public function Links();
public function Tutoriale($str, $nota);
}
?>
Implementare interface
Dupa ce a fost definit tiparul "interface", se pot crea clase care implementeaza metodele stabilite in acel tipar, respectand si
numarul de parametri.
Implementarea se face adaugand cuvantul implements si numele Interfatei la definirea claselor, dupa numele lor.
class NumeClasa implements numeInterfata {
// Instructiuni
}
Acestea trebuie sa contina in corpul lor toate metodele definite in "interface", cu atribut "public", si numarul de parametri stabiliti
pt. fiecare (numele la parametri poate fi diferit). Pe langa acestea pot contine si alte metode.
Iata un exemplu cu o clasa care implementeaza interfata ITest creata mai sus.
<?php
// Creare clasa care aplica Interfata ITest
class WebDevelopment implements ITest {
// Definire proprietate 'link' (cu atribut "protected")
protected $link = 'www.marplo.net';
- Metodele obligatorii (aici "Links()" si "Tutoriale()") respecta exact numarul de parametri stabiliti in "interface" "ITest". Alte metode
(aici "setLink()") si proprietati sunt optionale, in functie de rolul fiecarei clase.
- Numele parametrilor nu conteaza (observati ca in loc de $str s-a folosit $gen), dar numarul lor trebuie sa fie aceleasi ca in
"interface".
- Daca vreuna din conditii nu ar fi respectata in clasa, cum ar fi: nedefinirea unei metode, adaugarea de parametru in plus sau
minus; scriptul genereaza eroare.
Astfel, implementarea de "interface" este utila mai ales cand sunt create mai multe clase cu roluri similare si dorim ca acestea sa
aibe toate o anumita ordonare si structura minima de metode, mai usor de retinut.
// Returneaza valoarea unei variabile din ea (re), ce preia argumentele "nr", "gen" si proprietatea "adr"
public function Tutoriale($gen, $nr) {
$re = $nr.'-'. $this->adr. $gen;
return $re;
}
}
?>
Intr-un script PHP se scrie urmatorul cod:
<?php
// Se includ fisierele cu clasele create mai sus (daca sunt in fisiere externe): ITest (Interfata), WebDevelopment si LimbiStraine
include('interf.ITest.php');
// Interface
include('class.WebDevelopment.php');
include('class.LimbiStraine.php');
// Creare functie care accepta doar argument cu obiect la clasele care au implementata Interfata "ITest"
function cursuri(ITest $obj) {
// Apeleaza metodele comune (stabilite in ITest) prin parametru $obj
echo '<br />'. $obj->Links();
echo '<br />'. $obj->Tutoriale('php-mysql', 4);
}
// "www.marplo.net" si "php-mysql-4"
// "Cale buna" si "4-www.marplo.net/php-mysql"
?>
- Functia "cursuri()" creata cu aceasta formula intre acolade "function cursuri(ITest $obj)" face ca ea sa accepte ca argument doar
obiect care are implementat "ITest".
- Observati ca apeland functia cu argumente diferite, reprezentand numele instantelor la clase, foloseste parametru $obj ca instanta
la clasa respectiva, si poate apela aceleasi metodele ("Links()" si "Tutoriale()") pt. fiecare deoarece aceste fiind specificate in
"interface" ele trebuie sa existe in fiecare clasa ce apartine acelei Interfate, cu acelasi numar de parametri.
- Prin aceasta tehnica nu mai e nevoie de a crea aceeasi functie pt. fiecare instanta.
Acest exemplu va afisa in browser urmatorul rezultat:
www.marplo.net
php-mysql-4
Cale buna
4-www.marplo.net/php-mysql