PHP a dedenie v objektovo-orientovanom kóde

Published:

Add / read comments

Objektovo-orientované programovanie (ďalej OOP) je modlou dnešných dní. Pre mnohých kóderov môže byť prechod z procedurálneho štýlu na OOP veľmi nepríjemný. Nevyhol som sa tomu ani ja!

Tak som si začal písať prvé skripty a študovať, čo to dokáže a také dedenie sa mi celkom páči. Využitie nájde v mnohých prípadoch. Predstavil som si situáciu, kde mám napr. nejaký databázový systém o chemikáliách. Pričom každá chemikália má spoločné informácie typu: výrobca, názov, vzorec atď. Teraz chcem, aby som z tochto systému mohol získať informácie o každej zlúčenine pre technické aj účtovné potreby. Tieto informáce sú však odlišné. Keby mám jednu triedu, ktorá dokáže obslúžiť všetky potreby, bola by veľmi veľká. Vznikla by taká "super trieda", ktorá by bola neprehľadná.

Vytvoril som si teda materskú triedu, ktorá vytvára objekt, ktorý má iba spoločné vlastnosti:

class Chemikalie {
 
  // verejne parametre (vlastnosti) triedy
  public $systematicky_nazov;
  public $trivialny_nazov;
  public $vzorec;
  public $vyrobca;	 
 
  // detske konstruktory rozsiruju materske o vlastne parametre (vlastnosti)
  function __construct( $systematicky_nazov, $trivialny_nazov, $vzorec,	$vyrobca ) {
 
    // inicializaciou triedy, vytvorim objekt triedy (jej instanciu), ktory ma taketo vlastnosti
    $this->systematicky_nazov = $systematicky_nazov;
    $this->trivialny_nazov = $trivialny_nazov;
    $this->vzorec = $vzorec;
    $this->vyrobca = $vyrobca; 
  }
 
  // verejna metoda v materskej triede
  public function vytvorPlneInfo() {
 
    // vygeneruje kompletne info zlucenine (nazov+vzorec)
    return $this->systematicky_nazov." (".$this->trivialny_nazov.") [".$this->vzorec."]"; 
  }	
}

Objekt materskej triedy vytvorím pomocou slovíčka "new". Konštruktor objektu prijme ako argumenty informácie o zlúčenine nasledovne:

//vytvorim instanciu (objekt) materskej triedy  
$matka = new Chemikalie ('etín','acetylén','C2H2','firma s.r.o.');

O tom, že sa objekt podarilo vytvoriť, sa dá ľahko presvedčiť:

//vypisem vlastnosti materskeho objektu
echo 'Materský objekt: '; print_r($matka);

Takisto môžeme pristúpiť k verejnej metóde objektu pomocou špeciálneho znaku "->"

//Verejná metóda materského objektu
echo $matka->vytvorPlneInfo();

Aby nevznikla super trieda, pre účtovné potreby sa vytvorí detská trieda, ktorá rozširuje vlastnosti materskej. Použije sa špeciálne slovíčko "extends" a uvedie sa názov detskej triedy a akú triedu rozširuje:

class UctovneInfo extends Chemikalie {
 
  public $cena;
  public $mena;
  public $jednotka;
 
  public function __construct( $systematicky_nazov, $trivialny_nazov, $vzorec, $vyrobca, $cena, $mena, $jednotka ) {
 
    //vyuzijeme matersky konstruktor 
    parent::__construct( $systematicky_nazov, $trivialny_nazov, $vzorec, $vyrobca );
 
    //doplnim detsku triedu o vlastne parametre
    $this->cena = $cena;
    $this->mena = $mena;
    $this->jednotka = $jednotka;
  }
 
  public function ziskatCenu() {
    return $this->cena;
  }
 
  public function ziskatMenu() {
    return $this->mena;
  }
 
  public function ziskatJednotku() {
    return $this->jednotka;
  }
 
  //rozsirime matersku metodu
  public function vytvorPlneInfo() {
    $prem = parent::vytvorPlneInfo();
    $prem .= "Cena = $this->cena [$this->mena/$this->jednotka]";
    return $prem;
  }
}

Ako vidieť, detská trieda nerozširuje iba konštruktor materskej triedy, ale môže rozširovať aj ľubovoľnú verejnú metódu. Destký objekt dedí prístup do všetkých verejných a chránených metód, avšak nie do privátnych metód a vlastností materského objektu. Vytvorím si nový detský objekt:

//vytvorim instanciu (objekt) detskej triedy
$product = new UctovneInfo('etín','acetylén','C2H2','firma s.r.o.','10','euro','l');

Ak teraz vypíšeme obsah detského konštruktoru a detskej verejnej metódy, tak budú v sebe obsahovať informácie aj z materskej triedy:

//vypisem vlastnosti detskeho objektu
echo 'Detský objekt: '; print_r($product);
//Verejná metóda detského objektu, rozširuje materský
echo $product->vytvorPlneInfo();

Detská trieda môže samozrejme obsahovať aj vlastné verejné metódy:

//Verejná metóda detského objektu, nerozširujúca materský
echo 'cena - '.$product->ziskatCenu();

Pre technické potreby sa vytvorí druhá detská trieda:

class TechnickeInfo extends Chemikalie {
 
  public $skupenstvo;
 
  public function __construct( $systematicky_nazov, $trivialny_nazov,	$vzorec, $vyrobca, $skupenstvo ) {
 
    parent::__construct( $systematicky_nazov, $trivialny_nazov,	$vzorec, $vyrobca );
 
    $this->skupenstvo = $skupenstvo; 
  }
 
  public function ziskatSkupenstvo() {
    return $this->skupenstvo;
  }
 
  //rozsirime matersku metodu
  public function vytvorPlneInfo() {
    $prem = parent::vytvorPlneInfo();
    $prem .= "Skupenský stav = $this->skupenstvo";
    return $prem;
  } 
}

Vytvorím si jej inštanciu (objekt):

//vytvorim instanciu (objekt) detskej triedy
$product = new TechnickeInfo('etín','acetylén','C2H2','firma s.r.o.','plyn');

Vypíšem vlastnosti objektu a verejnej metódy:

//vypisem vlastnosti detskeho objektu
echo 'Detský objekt: '; print_r($product);
//Verejná metóda detského objektu, rozširuje materský 
echo $product->vytvorPlneInfo();

Ak sa chcem dostať k ľubovolnej vlastnosti materského, alebo detského objektu, tak stačí napísať:

//vypise vyrobcu (verejna vlastnost materskeho objektu)
echo $product->vyrobca;

//vypise menu (verejna vlastnost jedneho detskeho objektu)
echo $product->mena;

Tak a to by bolo asi tak všetko. Ako vidieť, napokon to nie je až také hrozné. Ešte jedna poznámka: všetky metódy a vlastnosti objektu sú defaultne "public", v prípade ak programátor toto neuvedie. Existujú ešte privátne a chránené metódy a vlastnosti, ale o tom ako riadiť prístup k objektom až nabudúce.

Published:

Add / read comments

FIND ME

Share, follow or connect with me.