Nu mai puțin important, în opinia mea, metodele magice sunt metode interceptor __get. __set. __isset. __unset. __call. Noi le numim acest lucru, deoarece le place mesajele interceptate la un membri non-existente sau inaccesibile unei clase.
Metode __get și __set
Aceste metode sunt declanșate atunci când se referă la domenii inexistente sau inaccesibile unei clase sau a unui strămoș. Acestea trebuie să fie declarate cu specificatorul de acces public. Atunci când această metodă este invocată __get atunci când încearcă să citească valoarea proprietăților latente sau inexistente. Ca o opțiune este nevoie de un șir de caractere care conține numele proprietății la care a existat o încercare de a transforma. Valoarea de returnare a acestei metode este văzută ca o valoare a proprietății la care a avut loc lovit, indiferent dacă proprietatea este ascunsă, sau nu există.
Ieșirea acestui script:
Hit a avut loc la proprietate x
x: 8
Hit apărut la proprietatea y
y: 16
A existat un apel la proprietate nonexistentProperty
câmp nonexistent:
După cum puteți vedea, metoda __get într-o astfel de punere în aplicare, cu referire la o proprietate inexistentă returneaza null. care, în acest exemplu sunt convertite în șir gol.
Metoda __set se numește atunci când o încercare de a modifica valoarea unei proprietăți inexistente sau ascunse. Ca parametrii este nevoie de un nume de proprietate și valoarea pe care el încerca să atribuie. Adăugați această metodă la punctul nostru de clasă.
Acum, de fiecare dată când încercați să schimbați valoarea proprietăților ascunse sau non-existente se va afișa un mesaj adecvat.
$ P = new Point (8, 16); $ P-> x = 10; $ P-> y = 20; $ P-> z = 30;
Ieșirea acestui script:
Proprietățile x este setat la 10
Proprietățile y este setat la 20
Proprietățile Z este setat la 30
Metode și __get __set utile în care acestea pot fi folosite pentru a imita prezența proprietăților care nu este. Este posibil să se facă acest lucru, nu este în căutarea în clasă, nu va fi nimic de ghicit. De exemplu, avem o clasă care descrie pătrat cu un câmp ascuns care conține lungimea pătrat (lateral).
Emularea existența acestei clase de proprietăți „zona» (zona). În același timp, să luăm în considerare faptul că suprafața unui pătrat și lungimea laturilor sale depind unele de altele.
Acum, instanțele din această clasă se va comporta ca și în cazul în care zona de proprietate este prezentă în clasă, iar proprietatea este accesibilă din partea exterioară.
$ Squere = new Squere (25); echo $ squere-> domeniu; // 25 * 25 = 625
În același timp, nu trebuie să vă faceți griji despre ceea ce zona pătrat depinde de lungimea laturilor sale.
$ Squere = new Squere (10); echo $ squere-> side; // 10 $ squere-> zona = 25; echo „partea schimbat după schimbarea domenii:
$ Squere-> side „ ""; // 5 = sqrt (25)
Absolut același lucru poate fi obținut prin utilizarea unor metode, dar în acest caz, pentru a obține sau de a modifica valoarea fiecărui câmp ar trebui să scrie propria metodă, care este destul de plictisitor, mai ales în cazul în care o mulțime de domenii de clasă. În unele medii de dezvoltare, cum ar fi în NetBeans oferă chiar și generarea automată a unor astfel de tehnici.
Metode care organizează accesul la câmpurile de clasă, numit getteri (utilizate pentru a obține valori) și setter (utilizate pentru a modifica valorile). Ca o regulă, codul în aceste metode și formulaic evidente. Ele sunt scrise pentru a preveni atribuirea de valori incorecte ale proprietăților de clasă. De exemplu, avem o clasă care descrie o persoană. O instanță a acestei clase stochează informații despre numele și vârsta lui. Cu ajutorul getters și setteri pentru corectarea acestor date.
$ Man = new Man ( 'Jhon Doe', 21); $ Om-> setAge (-2); // vârstă incorect. Nu va fi finalizarea scenariului
Poate că, în acest caz, codul a devenit un pic confuz, dar uneori, atunci când verificarea i se atribuie o valoare de proprietăți sunt aceleași, sau ceva similar cu aceasta tehnica poate reduce ușor și de a îmbunătăți codul. De asemenea, în acest exemplu, este interzis să se facă referire la o clasă de proprietăți care nu există. O astfel de interdicție s-ar putea salva, în viitor, de la unele erori.
Caracteristici emulare sunt numite uneori suprasarcină, dar în multe alte limbi sub suprasarcină să înțeleagă un pic de ce acest fenomen, astfel încât să nu confunde nu, prefer să nu folosească acest concept ambiguu.
metoda __isset
păstrați întotdeauna în minte atunci când simulează proprietățile care utilizează metode __get și __set, că într-adevăr nu există astfel de proprietăți. Dar utilizați clasă poate și un alt programator, și proprietățile simulate pot fi luate pentru a le pentru efectiv existente. S-ar părea că nu este nimic în neregulă cu asta, dar atunci când încercați să verificați pentru proprietățile simulate prin utilizarea isset puteți obține rezultate neașteptate:
$ P = new Squere (10); // prezența proprietăților zonei Squere clasă simulat var_dump (isset ($ P-> zona)); // bool (false)
Pentru a evita astfel de neînțelegeri, există o metodă __isset magică. care este cauzat atunci când încercați să verificați pentru proprietățile indisponibile sau inexistente folosind funcția isset. __isset returnat de o valoare Boolean și spune dacă să ia în considerare proprietatea existentă.
Adăugați implementarea __isset metoda Squere în clasa:
Anton, aș dori să vă mulțumesc pentru lecțiile, să continue în același spirit, pentru el însuși în cele din urmă să înțeleagă unele din lucrurile pe care a fost dificil de a învăța din alte surse, mulțumesc! Ei bine, întrebarea este: în cod, care descrie metode și __get __set în cazul în care zona calculată a pătrat, linia 18 a reveni $ this-> getArea (valoare $); Este adevărat? Trecem într-o opțiune getArea funcție, dar descrierea funcției parametrilor de intrare nu este, și, în general, valoarea variabilei $ în acest moment nu este inițializat?
E o greșeală. Fixe. Vă mulțumim pentru comentariu.