online: 3; azi: 1239; total: 53245 Webdesign - Phpmysql - 52

PHP OOP - metode Accesor si Destructor

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 generic Metoda 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;          // Proprietate declarata fara valoare
  private $categorie;          // Proprietate privata, fara valoare

  // Constructor
  public function __construct($site, $categorie) {
    // Atribuie proprietatilor valoarea din parametri
    $this->site = $site;
  $this->categorie = $categorie;
  }

  // Metoda pt. afisare adresa pagini
  public function pagini($pag) {
    // 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

// Creare instanta de obiect la clasa SiteClas, cu argumentele necesare
$objSite = new SiteClas('discant.ro', 'php-mysql');

$objSite->pagini('oop-clase-obiecte.html');        // Apelare metoda pagini()
?>
- Dupa executie, in browser va afisa:
www.discant.ro/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;

2. Accesare si modificare proprietati prin metode Accesor

Variabilele in PHP nu au un tip de date stabilit precis la declararea lor, de exemplu, o variabila poate sa contina initial ca valoare un numar, iar pe parcursul scriptului sa i-se atribuie ca valoare un sir sau un Array. Aceasta flexibilitate este folositoare, dar in unele situatii poate prezenta probleme in anumite contexte din codul unei metode.
De exemplu, daca intr-o metoda se parcurg datele dintr-o proprietate de tip Array iar in script acea proprietate primeste o valoare de tip Sir, apar erori.
Pentru a fi siguri ca o proprietate primeste doar tipul de date care poate fi corect utilizat, se declara ca private si se folosesc metode accesor pentru accesarea ei, cu functii PHP de verificare a tipului de date. Aceste functii sunt:

  • is_bool() - Boolean - una din valorile speciale: true sau false
  • is_integer() sau is_int() - Integer - numere intregi (fara virgula)
  • is_float() sau is_double() - Float /Double - numere cu zecimale (cu virgula)
  • is_numeric() - Number - orice numar sau sir ce reprezinta un numar
  • is_string() - String - siruri de caractere si cuvinte
  • is_array() - Array - Array
  • is_object() - Object - Obiect
  • is_resource() - Resource - un identificator pentru lucru cu date din sure externe (fisier, baza de date)
  • is_null() - Null - Valoare NULL sau nedefinita

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) {
    // Atribuie proprietatilor valoarea din parametri
    $this->site = $site;
    $this->categorie = $categorie;
  }

  // Metoda accesor - returneaza valoarea proprietatii 'categorie'
  public function getCategorie() {
    return $this->categorie;
  }

  // Metoda accesor pt. setare valoare la "categorie"
  public function setCategorie($val) {
    // Daca $val e de tip Sir (string) si are cel putin un caracter
    // Atribuie valoarea lui proprietatii 'categorie'
    // Altfel, returneaza eroare
    if(is_string($val) && strlen($val)>0) {
      $this->categorie = $val;
    }
  else throw new Exception('Valoare incorecta pt. categorie');
  }

  // Metoda pt. afisare adresa pagini
  public function pagini($pag) {
    // Afiseaza un sir cu adresa URL, www., valoarea celor 2 proprietati si argumentul primit
    echo '<br />www.'. $this->site.'/'. $this->categorie.'/'. $pag;
  }
}
?>
- Prin declararea proprietatilor ca "private", se respinge accesul direct la ele in afara clasei, iar pt. proprietatea "categorie" s-a creat posibilitatea de a fi accesata si modificata valoarea ei prin metodele accesor: getCategorie() si setcategorie($val).
- In setCategorie($val) se atribuie valoarea transmisa pt. $val la "categorie" (prin formula $this->categorie = $val;) doar daca $val e de tip Sir (String) si are cel putin un caracter; altfel, utilizand formula speciala "throw new Exception('Eroare')" returneaza un mesaj de eroare.
- Pentru a testa efectul acestor metode, se executa scriptul urmator, in care e utilizata o instanta la aceasta clasa.
<?php
include('class.SiteClas.php');        // Include clasa

// Creare instanta de obiect la clasa SiteClas
$objSite = new SiteClas('discant.ro', 'php-mysql');

// Afiseaza valoarea returnata de getCategorie() (reprezentand valoarea proprietatii "categorie")
echo $objSite->getCategorie();

// Modifica prin setCategorie() valoarea proprietatii "categorie"
$objSite->setCategorie('html');

$objSite->pagini('introducere.html');        // Apelare metoda pagini()
?>
- In browser scriptul va afisa:
php-mysql
www.discant.ro/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 accesor - schimba valoarea proprietatii 'nume'
  public function setNume($nume) {
    $this->nume = $nume;
  }

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

// Apeleaza metoda setNume(), care seteaza alta valoarea la prop. 'nume'
$obj->setNume('Ius');

// Sterge instanta de obiect $obj
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, cu unset($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 Ius

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().


In lectia urmatoare sunt prezentate Constante si elemente Statice in Clasele PHP.