Pisano u PHP

Brian Cantwell Smith je 1980 godine u svojoj doktorskoj disertaciji osmislio termin refleksije u kompijuterskom programiranju, te svaki programer koji radi OOP a drzi do sebe mora da zna šta je i kako se primenjuje Reflection u programskim jezicima.
Reflection je jako opširna tema, tako da primere za većinu možete videti na wiki stranici o refleksiji, ja ću pisati o voljenom PHP-u ;). Inače refleksija u ovom "našem" smislu i okruženju znači da program moze da nadgleda(sebe) i modifikuje sopstvenu strukturu i to u trenutku kada se izvršava(runtime).
Reflection API je sastvni deo PHP(core) i ne zahteva nikakve dodatne module za instalirati i/ili konfigurisati. Dakle od 5. verzije ali se slabo upotrebljava a i mnogi ne znaju da PHP to može ;).
Slučaji najčešćeg korišćenja:
- Provera da li su odredjene metode dostupne
- Pozivanje klase sa više kontrole
- Izmene stanje promenljivih i metoda
- Izvlačenje vrednosti promenljivih koje su inače nedostupne
Navode se još neka kao dobijanje meta informacije iz komentara ali iskreno nisam probao, dosada nisam imao potrebe za tako nečim, u svakom slučaju celokupnu dokumentaciju možete pročitati na php manual stranicama.
Ako pogledate kod, videćete kako je moguće modifikovati nedostupnu promenljivu:
class prvaKlasa {
protected $prva = 1;
public function izvPrvu() {
return $this->prva;
}
}
class drugaKlasa extends prvaKlasa {
protected $druga = 2;
public function izvDrugu() {
return $this->druga;
}
}
class trecaKlasa extends drugaKlasa {
protected $treca = 3;
public function izvTrecu() {
return $this->treca;
}
}
Ako instanciramo klasu trcaKlasa i pozovemo metodu izvDrugu(); ispis će biti 2
// bez refleksije
$obj = new trecaKlasa();
echo 'Bez Refleksije: '.$obj->izvDrugu();
Morate da primetite da ne postoji direktan, posredan način da se promenljiva $druga modifikuje, ali uz pomoć Reflection API-ja može:
// refleksija
$rf = new ReflectionClass('trecaKlasa');
$ref = $rf->getProperty('druga');
$ref->setAccessible(true);
$ref->setValue($obj, 64);
echo 'Sa Refleksijom: '.$obj->izvDrugu();
Ispisaće 64, moćno zar ne?
Ako kod nije bas najjasnije prikazan, primer ovog fajla je ovde.




Budi prvi i
Ostavi komentar