Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

3. diel - Atribúty a magické metódy v PHP

V minulej lekcii, Prvý objektová aplikácie v PHP , sme si vysvetlili ako OOP funguje a vytvorili sme si prvé jednoduchú objektovú aplikáciu. V tej budeme dnes v PHP tutoriálu pokračovať.

Atribúty

Naša trieda Clovek má zatiaľ iba metódy (dokonca len jednu). Pridajme jej nejaké atribúty. Každý náš človek bude mať meno, priezvisko a vek. Atribúty triede pridáme nasledovne:

<?php

class Clovek
{

    public $jmeno;
    public $prijmeni;
    public $vek;

    . . .

Už vieme, že atribúty fungujú ako premenné, ale náleží objektu. Public pred názvom atribútu označuje, že je atribút viditeľný zvonku (podobne ako tomu bolo u metódy).

Aby sme si atribúty vyskúšali, upravíme si našu metódu pozdrav (). Budeme chcieť, aby pozdravila "Ahoj, ja som" ak tomu dodala hodnotu z atribútu $ jmeno. Budeme teda chcieť vnútri metódy použiť atribút inštancie. Zaujímavá otázka je, kde tu inštanciu vezmeme, pretože trieda je vzor spoločný pre všetky objekty daného typu (pre všetkých ľudí). Riešenie je veľmi jednoduché, v triede môžeme používať kľúčové slovo $ this. Pod touto premennou sa skrýva inštancie, s ktorou práve pracujeme a na ktorej je teda metóda volaná. Metóda pozdrav bude teraz vyzerať nasledovne:

public function pozdrav()
{
    echo('Ahoj, já jsem ' . $this->jmeno);
}

Presuňme sa teraz do index.php, kde tvoríme inštanciu. Teraz ju nastavíme atribúty, ktoré sme triede Clovek dodali:

Klikni pre editáciu
  • App
    • index.php
    • tridy
      • Clovek.php
  • <?php
    require_once('tridy/Clovek.php');
    
    $karel = new Clovek();
    $karel->jmeno = 'Karel';
    $karel->prijmeni = 'Novák';
    $karel->vek = 30;
    $karel->pozdrav();
    
  • <?php
    
    class Clovek
    {
    
        public $jmeno;
        public $prijmeni;
        public $vek;
    
        public function pozdrav()
        {
            echo('Ahoj, já jsem ' . $this->jmeno);
        }
    
    }
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    Do index.php si dodajme ešte HTML hlavičku, aby nám aplikácia vedela česky. Keď ju teraz spustíme, vidíme, že metóda naozaj pristúpila k atribútu a vypísala jeho hodnotu.

    Tvoja stránka
    localhost

    Aby sme si vyskúšali, že je trieda univerzálny, vytvorme si ešte Jana. Celý kód indexu vrátane HTML bude vyzerať takto:

    Klikni pre editáciu
    • App
      • index.php
      • tridy
        • Clovek.php
    • <!DOCTYPE html>
      
      <html lang="cs-cz">
          <head>
                  <meta charset="utf-8" />
                  <title>OOP na ITnetwork</title>
          </head>
      
          <body>
              <?php
              require_once('tridy/Clovek.php');
      
              $karel = new Clovek();
              $karel->jmeno = 'Karel';
              $karel->prijmeni = 'Novák';
              $karel->vek = 30;
      
              $jan = new Clovek();
              $jan->jmeno = 'Jan';
              $jan->prijmeni = 'Nový';
              $jan->vek = 24;
      
              $karel->pozdrav();
              echo('<br />');
              $jan->pozdrav();
      
              ?>
          </body>
      </html>
      
    • <?php
      
      class Clovek
      {
      
          public $jmeno;
          public $prijmeni;
          public $vek;
      
          public function pozdrav()
          {
              echo('Ahoj, já jsem ' . $this->jmeno);
          }
      
      }
      
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      Výstup aplikácie vyzerá takto:

      Tvoja stránka
      localhost

      Objekty sú vysoko univerzálne komponenty, stačí vytvoriť spoločnú triedu a potom môžeme pracovať s rôzne nastavenými inštanciami rôznym spôsobom. A tým to zďaleka nekončí, uvidíte, že toho vie ešte veľa.

      Magické metódy

      PHP nám v triede umožňuje definovať niekoľko tzv. Magických metód. Magických preto, že si ich nevoláme my sami (aj keď samozrejme tiež môžeme), ale spúšťa sa v určitých chvíľach automaticky. Reagujú teda na určité udalosti. Všetky magické metódy začínajú na dve podčiarknutia. Je ich niekoľko, ale my si zatiaľ zmienime prvé 3.

      Konštruktor

      V našom programe si najprv vytvárame prázdnu (Nenastavené) inštanciu človeka a až potom mu nastavujeme meno, priezvisko a vek. To má hneď niekoľko nevýhod, najmä:

      1. Možno vytvoriť nenastavený objekt a pracovať s ním, čo iste vyvolá chyby, napr. Pri napísanie mena, ktoré nie je zadané.
      2. Nastavenie všetkých hodnôt objektu zaberá zbytočne miesto v zdrojovom kóde.

      Tento problém za nás rieši konštruktor. Konštruktor je metóda, ktorá sa automaticky spustí pri vytvorení inštancie. Slúži na nastavenie vnútorného stavu objektu tak, aby bol pripravený na použitie. Ak má naša trieda konštruktor, nemožno jej inštanciu vytvoriť inak, než práve použitím konstruktoru.

      Konštruktor je metóda s menom __construct () as ľubovoľným počtom parametrov. Pridajme si ho do našej triedy a ako parametre mu dajme $ jmeno, $ priezvisko a $ spevokol. Hodnoty z parametrov nastavíme atribútom inštancie:

      public function __construct($jmeno, $prijmeni, $vek)
      {
          $this->jmeno = $jmeno;
          $this->prijmeni = $prijmeni;
          $this->vek = $vek;
      }

      Konštruktor do triedy vložíme za atribúty a pred ostatné metódy. Keď teraz našu aplikáciu spustíme, tak nebude fungovať. Je to z toho dôvodu, že trieda má teraz konštruktor a ten vyžaduje určité parametre, ktoré sme pri vytváraní inštancií nezadali. Vidíme, že nás PHP nenechá vytvoriť objekt inak, ako predpisuje konštruktor.

      Prejdime do index.php a modifikujte PHP kód do nasledujúcej podoby:

      Klikni pre editáciu
      • App
        • index.php
        • tridy
          • Clovek.php
      • <?php
        
        require_once('tridy/Clovek.php');
        
        $karel = new Clovek('Karel', 'Novák', 30);
        $jan = new Clovek('Jan', 'Nový', 24);
        
        $karel->pozdrav();
        echo('<br />');
        $jan->pozdrav();
        echo('<br />');
        
      • <?php
        
        class Clovek
        {
        
            public $jmeno;
            public $prijmeni;
            public $vek;
        
            public function __construct($jmeno, $prijmeni, $vek)
            {
                $this->jmeno = $jmeno;
                $this->prijmeni = $prijmeni;
                $this->vek = $vek;
            }
        
            public function pozdrav()
            {
                echo('Ahoj, já jsem ' . $this->jmeno);
            }
        
        }
        
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        Prvý dojem je zvýšenie prehľadnosti kódu. Vidíme, že ona záhadná zátvorka za triedou pri vytváraní jej inštancie slúži na odovzdanie parametrov konstruktoru. Konštruktor následne tieto parametre uloží do objektu a tým ho pripraví na použitie. Využitie konstruktoru samozrejme nie je obmedzené len na nastavovanie atribútov, môžeme v ňom urobiť čokoľvek ako v bežnej metóde. Konštruktor môžeme definovať aj bez parametrov, napr. Si v ňom niekam uložíme čas kedy bola inštancia vytvorená a podobne.

        Destruktor

        Pre úplnosť si uveďme aj destruktor. Ako vás asi napadlo, destruktor je metóda, ktorá sa zavolá vo chvíli, keď sa objekt odstraňuje z pamäte. Môžeme tu vykonať nejaké upratovacie práce, ktoré sú potrebné na uvoľnenie zdrojov, ktoré objekt využíval. Keďže skripty v PHP beží len chvíľu a potom sa všetka pamäť, ktorú skript využíval, uvoľní, nemajú deštruktory príliš veľký význam. Napriek tomu ich môžeme využiť napr. Na uloženie dát do databázy pred zrušením nejakého objektu alebo databázy môže pred zrušením ukončiť databázové spojenie a podobne. Vy v súčasnej dobe destruktor asi nevyužijete, ale patrí ku konstruktoru, tak prečo si ho nevyskúšať.

        Metóda destruktor sa volá __destruct (). Vypíšme v nej hlášku o tom, že sa objekt odstránil z pamäte:

        Klikni pre editáciu
        • App
          • tridy
            • Clovek.php
          • index.php
        • <?php
          public function __destruct()
          {
              echo('Byl jsem odstraněn z paměti.');
          }
          
        • <?php
          
          require_once('tridy/Clovek.php');
          
          $karel = new Clovek('Karel', 'Novák', 30);
          $jan = new Clovek('Jan', 'Nový', 24);
          
          $karel->pozdrav();
          echo('<br />');
          $jan->pozdrav();
          echo('<br />');
          
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          Keď teraz aplikácie spustíme, uvidíme, že úplne na konci sa vypíše 2x hláška "Bol som odstránený z pamäte.".

          Tvoja stránka
          localhost

          Hlášku vypíšu pred svojím zničením $ karel a $ jan, na ich odstránenie z pamäte dôjde až pri ukončení aplikácie alebo presnejšie vo chvíli, keď je už nemá zmysel uchovávať.

          Destruktor môžeme z našej triedy zase odobrať.

          ToString

          Magická metóda __toString () sa spúšťa vo chvíli, keď chceme objekt previesť na textový reťazec, najčastejšie teda keď ho chceme vypísať. Schválne si skúste teraz vypísať objekt $ karel:

          echo($karel);

          PHP vám vyhodí chybu, keďže nie je definované akým spôsobom sa majú ľudia vypisovať. Ľudia sú objekty, ktoré majú niekoľko vlastností, PHP jednoducho nevie ktoré z nich vypísať. Doplňme teda do našej triedy Clovek metódu __toString (), ktorá bude vracať atribút meno.

          public function __toString()
          {
              return $this->jmeno;
          }

          Ak sa teraz znovu pokúsime Karla alebo Jána vypísať, vypíše sa jednoducho ich meno.

          Konštruktory nám umožňujú vykonávať tzv. Zapuzdrenie, ku ktorému sa dostaneme nabudúce. Dnešné projekt máte ako vždy v prílohe spolu so zdrojovými kódmi. V budúcej lekcii, Riešené úlohy k 1.-3. lekciu OOP v PHP , sa budeme venovať zapuzdrenie.

          V nasledujúcom cvičení, Riešené úlohy k 1.-3. lekciu OOP v PHP, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


           

          Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

          Stiahnuť

          Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

          Stiahnuté 1524x (862 B)
          Aplikácia je vrátane zdrojových kódov v jazyku PHP

           

          Ako sa ti páči článok?
          Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
          Predchádzajúci článok
          Prvý objektová aplikácie v PHP
          Všetky články v sekcii
          Objektovo orientované programovanie (OOP) v PHP
          Preskočiť článok
          (neodporúčame)
          Riešené úlohy k 1.-3. lekciu OOP v PHP
          Článok pre vás napísal David Hartinger
          Avatar
          Užívateľské hodnotenie:
          6 hlasov
          David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
          Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
          Aktivity