Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

<?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);
    }

}

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:

<!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);
    }

}

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:

<?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);
    }

}

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:

<?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 />');

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é 1479x (862 B)
Aplikácia je vrátane zdrojových kódov v jazyku PHP

 

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:
5 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