1. Főoldal
  2. Cikkek
  3. Dev
  4. [OOPweb] Magic methods és az öröklődés

[OOPweb] Magic methods és az öröklődés

Dev

Megérkeztünk cikksorozatunk negyedik részéhez, melyben be is fogjuk fejezni az alapozást, a következő cikkben már ténylegesen elkezdjük a weboldalunk felépítését - mely közben azért még néhány dolgot meg fogunk ismerni. Amennyiben az előző részeket nem olvastad, akkor megtalálhatod azokat a további részek című oldalrésben.

Mostani cikkünkben két dologgal fogunk megismerkedni, első körben a magic methods-okkal találkozhatunk, majd szót ejtünk az öröklődésről is. 

Magic methods

Az elnevezésből arra következtethetnénk, hogy ezek valamilyen módon a többi közül kilógó, különleges függvények lesznek - és tényleg erről van szó!  Ezek megismerése nagyon egyszerű, mivel minden esetben "__" prefixxel kezdődnek. Ha most ez a jel valahonnan ismerősnek tűnik, akkor gratulálok - az előző részekben jól figyeltél! a__construct és a __destruct függvényeket már eddig is használtuk, és különlegességük az volt, hogy ezeket a függvényeket sosem hívtuk meg a kódból, mégis lefutottak - a construct az osztály példányosításakor (az osztályból egy objektum létrehozásakor), a destruct az objektum megszűnésekor futott le. Viszont még létezik más ilyen függvény is, első körben nézzünk is egy példát egy osztályra:

class logEverything{
 
     public $veryImportantVariable = 2;
 
     private $log = array();
 
     public function __construct(){
        $this->log[] = 'Létrejöttem';
     }
 
     public function __destruct(){
        $this->log[] = 'Megszűntem';
        //save log to database
     }
 
     public function printLog(){
        print_r ($this->log);
     }
}

//test code:

$test = new logEverything();
echo $test->veryImportantVariable;
$test->veryImportantVariable = 10;
echo $test->veryImportantVariable;
$test->printlog();

Tehát a fenti példánkban egy olyan osztályunk van, ahol minden elvégzett műveletet / változást menteni szeretnénk, majd végre is hajtunk műveleteket - változó értékét akarjuk módosítani. (A példakódunk értelmességét most nem érdemes vizsgálni, természetesen ez az osztály soha nem lesz megtalálható semmilyen programban - lévén, hogy ténylegesen semmit sem csinál, így semmire sem jó.)

A programunk működik is, csak éppen a log tömbben a módosításokról és kiíratásról semmilyen információnk nem lesz, abban csak az objektum létrejötte és megszűnése fog szerepelni. Viszont van néhány, beszédes elnevezésű  Mmagic methodunk:  __get, __set, __isset, __unset. Próbáljuk is ki őket:

 class logEverything{
 
     public $veryImportantVariable = 2; 
 
     private $log = array();
 
     public function __construct(){
        $this->log[] = 'Létrejöttem'; 
     } 
 
     public function __destruct(){ 
        $this->log[] = 'Megszűntem'; 
        //save log to database
     }
     
     public function __get($var){
        $this->log[] = 'Get: '.$var; 
        return $this->$var;
     }
 
     public function __set($var,$value){
        $this->log[] = 'Set: '.$var; 
        $this->$var = $value;
     }
 
     public function __unset($var){
        $this->log[] = 'Unset: '.$var; 
        unset($this->$var);
     }
 
     public function printLog(){
        print_r ($this->log);
     }
}

//test code:

$test = new logEverything();
echo $test->veryImportantVariable;
$test->veryImportantVariable = 10;
echo $test->veryImportantVariable;
$test->printlog();
 

Ezek után megnézve a log-ot meglepve tapasztalhatjuk, hogy semmi változás! Ennek oka az, hogy ezek a függvények csak akkor futnak le, ha olyan változóhoz szeretnél hozzáférni ami nem hozzáférhető számodra, vagy nem is létezik. A nagyonfontos változó privátra állításával viszont ellenőrizhetjük forráskódunk helyességét: 

  class logEverything{
 
     private $veryImportantVariable = 2; 
 
     private $log = array();
 
     public function __construct(){
        $this->log[] = 'Létrejöttem'; 
     } 
 
     public function __destruct(){ 
        $this->log[] = 'Megszűntem'; 
        //save log to database
     }
     
     public function __get($var){
        $this->log[] = 'Get: '.$var; 
        return $this->$var;
     }
 
     public function __set($var,$value){
        $this->log[] = 'Set: '.$var; 
        $this->$var = $value;
     }
 
     public function __unset($var){
        $this->log[] = 'Unset: '.$var; 
        unset($this->$var);
     }
 
     public function printLog(){
        print_r ($this->log);
     }
}

//test code:

$test = new logEverything();
echo $test->veryImportantVariable;
$test->veryImportantVariable = 10;
echo $test->veryImportantVariable;
$test->printlog();
 

Ezen módosítás után a kódunk már úgy működik, ahogy elterveztük. Ezek után az alábbi kód, elsőre érdekes kimenete is teljesen megmagyarázható lesz:

 class test{
      private $a = 2;
      public  $b = 2;
 
      public function __get($g){
            return 1;
      }
}

$test2 = new test();
echo $test2->a;
echo $test2->b; 

Ezen kívül még léteznek más magic method-ok is, de ezek után azok működései dokumentáció alapján is könnyen megérthetőek - úgyhogy rá is térhetünk cikkünk második témájára:

Öröklődés

Öröklődés esetén egy osztályunkat egy másik, úgynevezett leszármazott osztály által használunk.

Például ha egy weboldalon írunk egy osztályt általánosan a bejegyzések kezelésére (mely definiálja például a listázáskor egy oldalon megjelenő bejegyzések számát, azok lapozásához szükséges funkciókat), és ennek leszármazott osztálya(i) lehet(nek) az(ok) az osztály(ok), mely(ek) az egyes bejegyzésfajták speciális tulajdonságaihoz szükséges lehetőségeket tárolják (például a tartalmak megfelelő adatbázisból való lekérése, mely más például cikkek, zenék és filmek esetén is).

 class contents{
     protected $maxNumberInOnePage = 10; //protected, not private

     public function pageTurner($numbersOfContents,$currentPage=1){
         //do dometing
         $maxpage = ceil($numbersOfContents/$this->maxNumberInOnePage);
         echo 'Lapozó helye.. '.$currentPage.' / '.$maxpage.'
';
     }
}


class articles extends contents{
     public function selectContents($from){
         //do dometing
         $to = $from + $this->maxNumberInOnePage;
         echo 'cikkek '.$from.'-tól '.$to.'-ig.
';
     }
}

$articles = new articles();

$articles->selectContents(10);
$articles->pageTurner(34,2);

Ezzel cikksorozatunk negyedik részének végéhez értünk. A folytatásban elkezdjük felépíteni egyszerű weboldalunkat, miközben még tovább mélyítjük az objektum orientált programozással kapcsolatos tudásunkat.

vmarci21 profilképe
Veszter Márton @vmarci21 +531 Weblap fejlesztő, az IntoMedia tagja. PHP, JavaScript és MySql témák mellett érdekli a Windows, Linux disztribúciók, Android fejlődése, az IT biztonság, és az újdonságokat felmutató IT termékek.
0 hozzászólás
Hozzászóláshoz jelentkezz be vagy Regisztrálj!