miffmedia.com

Reflection API in PHP | miff blog

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

Komentar: