PHP OOP - Clase si Obiecte, Metoda constructor

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:


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: - Daca nu e adaugat nici un atribut, se considera "public".
Astfel, formula completa pentru crearea unei clase este: - 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 {
  public $site = 'www.marplo.net/';          // Proprietatea publica
  private $categorie = 'php-mysq/';          // Proprietate privata

  // 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;
  }
}
?>
- Aceasta este clasa "SiteClas", pentru a-o putea folosi in orice script, sa o salvam intr-un fisier separat, denumit "class.SiteClas.php".
- Formula "$this->site" indica /face sa fie apelata proprietatea "site" a obiectului curent din aceasta clasa (termenul $this (acesta, aceasta) indica precis ca se face referire la proprietatea respectiva, din instanta curenta).

Cand se acceseaza proprietati se foloseste un singur caracter $. Sintaxa este $obj->proprietate, desi variabila e definita "$proprietate".

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');        // Include clasa

$objSite = new SiteClas();         // Creare instanta de obiect la clasa SiteClas

echo $objSite->site;        // Afisaza valoarea proprietatii "site"

// Apeleaza metoda pagini() [cu un argument, dupa cum a fost definita]
$objSite->pagini('oop-clase-obiecte.html');

// Modifica valoarea proprietatii "site" si apeleaza iar metoda pagini()
$objSite->site = 'www.alt-site.net/';
$objSite->pagini('oop-clase-obiecte.html');
?>
- La include() trebuie adaugata calea si numele fisierului cu clasa, in raport cu scriptul curent (aici sunt in acelasi director).
- Inainte de a putea utiliza proprietati si metode din clasa, trebuie creata o instanta de obiect, deoarece prin aceasta se apeleaza aceste elemente, dupa sintaxa:
                $obiect->element
- Prin apelarea metodei "pagini()" ( $objSite->pagini('oop-clase-obiecte.html'); ) se va executa codul functiei "pagini()" definita in clasa, care afiseaza intr-un sir o adresa URL compusa din valorile proprietatilor si argumentul primit.
- Observati ca valoarea proprietatilor poate fi modificata in cadrul scriptului. Proprietatea "site" poate fi apelata atat pentru a fi utilizata /afisata valoarea ei cat si pentru adaugarea altei valori (aici sirul 'www.alt-site.net/').
- In browser va afisa:
www.marplo.net/
www.marplo.net/php-mysq/oop-clase-obiecte.html
www.alt-site.net/php-mysq/oop-clase-obiecte.html
Daca se incearca apelarea proprietatii private (aici "categorie"), de ex.: echo $objSite->categorie; , va determina o eroare ca cea de jos. Aceasta proprietate fiind declarata private poate fi utilizata doar in codul din interiorul clasei.
Fatal error: Cannot access private property SiteClas::$categorie in E:\server\www\index.php on line 15

Valoarea data unei proprietati definita in clasa poate fi de orice tip: sir (string), numar, Array sau Object.

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
  private $categorie = 'php-mysq/';          // Proprietate privata

  // Definire metoda constructor
  public function __construct($nume) {
    // Afiseaza un mesaj de bun venit, incluzand proprietatea "site"
    echo 'Bine ai venit '. $nume. ' pe '. $this->site. '<br />';
    echo $this->Mesaj();       // adauga si ce returneaza metoda Mesaj()
  }

  // 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

// Creare instanta de obiect la clasa SiteClas, cu argumentul necesar
$objSite = new SiteClas('Marius');
?>
- Prin executia metodei "__construct()", apelarea $this->Mesaj() determina si executia metodei Mesaj(), care avand atribut "protected" poate fi apelata doar in codul din corpul clasei sau alte clase extinse din ea (despre clase extinse intr-o lectie viitoare).
- Acest cod simplu va returna in fereastra urmatorul mesaj:
Bine ai venit Marius pe www.marplo.net/
Categoria de cursuri php-mysq/
- Fapt ce demonsreaza ca Metoda Constructor este apelata automat si se executa codul din ea cand e creata instanta de obiect.

Dupa cum se arata in exemplu de sus, in metoda constructor pot fi apelate si alte metode sau proprietati definite in clasa, cu sintaxa $this-> , fapt ce va face ca si acele metode sa fie executate cand e creat obiectul.
- Daca se apeleaza in script (in afara clasei) o metoda "protected" sau "private" (de ex., aici: $objSite->Mesaj();) va genera eroare.


• 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:
Missing argument 1 for SiteClas::__construct(), called in ...
Dar se pot declara parametri cu valoare deja atribuita, astfel, argumentul pentru ei devine optional.
De ex., in clasa Test de mai jos, metoda constructor e definita cu parametru $nume='Tu'.
<?php
class Test {
  // Constructor (cu un parametru cu valoare predefinita)
  public function __construct($nume='Tu') {
    echo '<br />Salut '. $nume;
  }
}
?>
- Daca instanta e creata fara argument, metoda constructor va folosi parametru $nume cu valoarea lui prestabilita ("Tu"), iar cand e adaugat argument, preia valoarea acestuia; dupa cum arata rezultatul afisat de scriptul urmator, in care se creaza doua instante de obiect la clasa Test.
<?php
// Creare instanta de obiect la clasa Test, fara argument
$obj1 = new Test();

// A doua instanta de obiect la clasa Test, cu argument
$obj2 = new Test('Marius');
?>
- Acest exemplu arata si faptul ca se pot crea si folosi mai multe instante de obiect la aceeasi clasa.
- In browser apare:
Salut Tu
Salut Marius

In lectia urmatoare sunt prezentate metodele accesor si _destruct().
Conectare si utilizare FTP ... <<-- Anterior ----------- Urmator -->> PHP OOP - metode ...

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Care tag adauga rand nou in paragraf?
<b> <br> <p>
Prima linie ...<br>
Alta linie...
Ce proprietate CSS seteaza spatiu dintre litere?
text-size word-spacing letter-spacing
#id {
  letter-spacing: 2px;
}
Ce functie obtine accesul la un element HTML cu un anumit ID?
getElementById() getElementsByTagName() createElement()
var elm = document.getElementById("theID");
var content = elm.innerHTML;
alert(content);
Clic pe instructiunea "echo" utilizata corect.
echo "CoursesWeb.net" echo "CoursesWeb.net"; echo ""CoursesWeb.net";
echo "Adresa URL: http://CoursesWeb.net";
Care din urmatoarele expresii cu "paint" (a picta) se foloseste pentru forma Negativa?
will paint not paint have painted
She does not paint that landscape.
- Ea nu picteaza acel peisaj.
Care din urmatoarele expresii cu "cantar" (a canta) se foloseste pentru propozitie Negativa?
ir a cantar cantaba no cantar
Ella no canta esa canciĆ³n.
- Ea nu canta acel cantec.
PHP OOP - Clase, Obiecte, constructor - Tutoriale PHP