Curs Php-mysql

In Programarea Orientata pe Obiecte (OOP) din PHP exista cateva metode mai speciale, care incep cu "__" (doua caractere '_'), precum __construct(). Acestea sunt numite generic Metode Magice (Magic Methods) si se executa automat in situatii mai speciale, cum ar fi de exemplu __get() pentru accesari de proprietati inexistente.
In aceasta lectie sunt prezentate cateva din cele mai folosite astfel de metode: __get(), __set(), __call() si __toString().
- Toate aceste metode magice trebuie sa fie definite cu atribut public.

1. Metode __get si __set

Metodele magice: __get() si __set() se folosesc de obicei impreuna si sunt create pentru lucru cu proprietati care nu sunt definite.

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 __get() (pt. accesari proprietati nedefinite)
  public function __get($name) {
    // Daca exista element cu cheia '$name' in $prop, afiseaza valoarea lui
    // Altfel, mesaj ca proprietatea nu exista
    if(array_key_exists($name, $this->prop)) echo $this->prop[$name]. '<br />';
    else echo 'Proprietatea <b>'. $name. '</b> nu exista.<br />';
  }

  // 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 />";
  }
}

// Creare instanta de obiect la clasa AClas
$obj = new AClas();

// Apelare proprietate neexistenta
$obj->noprop;           // Va determina executia metodei __get()

// Atribuire valoare la proprietate inexistenta
$obj->noprop = 'Valoare pt. noprop - PHP OOP';           // Va determina executia metodei __set()

// Apelare din nou a aceleiasi proprietati neexistente
$obj->noprop;           // Va determina executia metodei __get()

// Se verifica direct si elementul pe care-l creaza __set()
echo 'Verificare: '. $obj->prop['noprop'];
?>
- $prop e definita ca tip Array ca sa stocheze, prin metoda __set(), valorile atribuite unor proprietati nedefinite.
- Cand prin instanta de obiect la clasa e accesata o proprietate care nu exista ($obj->noprop;), se executa automat metoda __get(). Aici e definita sa verifice in $prop daca are element cu cheia $name (numele proprietatii accesate), daca exista acel element, afiseaza valoarea lui, altfel, afiseaza un mesaj.
- Cand se atribuie o valoare la proprietatea nedefinita ($obj->noprop = '...';), se executa automat metoda __set(). Aici e definita sa adauge in $prop un element cu numele proprietatii (cheie) si valoarea transmisa.
Vedeti si explicatiile din cod.
- Acest script va afisa urmatorul rezultat:
Proprietatea noprop nu exista.
Proprietatea noprop nu exista. S-a atribuit valoarea Valoare pt. noprop - PHP OOP la proprietatea: prop['noprop']
Valoare pt. noprop - PHP OOP
Verificare: Valoare pt. noprop - PHP OOP

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>';
  }
}

// Creare instanta de obiect la clasa AClas
$obj = new AClas();

// Apelare metoda inexistenta
$obj->site('cursuri', 'tutoriale');           // Va determina executia metodei __call()
?>
- 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;
  }

  // Metoda magica __toString()
  public function __toString() {
    return $this->mesaj;        // Returneaza valoarea proprietatii "mesaj"
  }
}

// Creare instanta de obiect la clasa AClas
$obj = new AClas('Fii bine primit');

// Apelare instanta, ca pe o variabila de tip String
echo $obj;           // Va determina executia metodei __toString()
?>
- 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

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Ce atribut indica faptul ca un camp de formular trebuie completat?
required="required" autofocus="autofocus" placeholder="text"
<input type="text" name="name1" required="required" />
Ce metoda CSS misoreaza sau mareste dimensiunile unui element (inclusiv continutul)?
translate() scale() skew()
#some_id:hover {
  transform: scale(2, 1.5);
  -ms-transform: scale(2, 1.5);    /* IE 9 */
  -moz-transform: scale(2, 1.5);   /* Firefox */
}
Click pe metoda obiectului Date care returneaza ziua din luna.
setDate() getMonth() getDate()
var rightnow = new Date();
var day = rightnow.getDate();
alert(day);
Ce functie este folosita pentru a incarca un fisier pe server?
is_file() move_uploaded_file() fopen()
if(move_uploaded_file($_FILES["field_name"]["tmp_name"], "dir/file_name")) {
  echo "Fisierul a fost incarcat";
}
Cum se spune in engleza expresia: "Ploua cu galeata"?
rain cats and dogs rain buckets quiet rain
In Bucharest it`s raining cats and dogs.
- In Bucuresti ploua cu galeata.
Cum se spune in spaniola expresia: "Ploua cu galeata"?
llover cubo llover a cántaros lluvia tranquila
En Madrid está lloviendo a cántaros.
- In Madrid ploua cu galeata.
Metode magice __get, __set, __call, __toString

Last accessed pages

  1. Creare link-uri (20329)
  2. Utilizarea .htaccess (623)
  3. Trecutul continuu - Exercitii si teste incepatori (13529)
  4. Sufixele ful, less si nees - Test engleza (4861)
  5. Trecut nedefinit vs imperfect (564)

Popular pages this month

  1. Curs HTML gratuit Tutoriale HTML5 (503)
  2. Cursuri si Tutoriale: Engleza, Spaniola, HTML, CSS, Php-Mysql, JavaScript, Ajax (444)
  3. Coduri pt culori (282)
  4. Formatare text in pagina html (164)
  5. Creare si editare pagini HTML (159)