Valentínska akcia je tu! Získaj až 80 % extra kreditov ZADARMO na náš interaktívny e-learning. ZISTIŤ VIAC:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 2. diel - Prvý objektová aplikácie v PHP

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Odpovedá na DarkCoder
Tomáš Prčík:1. februára 21:05

Mimochodem, díky za snahu - ale i v tom jste podle mě natrefil na to, co vůbec není vysvětleno. K čemu to this vlastně je. Proč si v rámci té funkce nemůžu prostě vytvořit nějakou proměnnou a na jiném místě kódu - kde ji potřebuju si ji prostě zavolat. K čemu to this vlastně je? Musí se používat? Nemusí? Jak se z něho doluje hodnota v něm uložená? Je v tom strašný chaos.

Avatar
Odpovedá na DarkCoder
Tomáš Prčík:1. februára 21:10

Pardon - napadá mě to postupně. A co když si v rámci té funkce zavedu třeba tři proměnné? Jak je všechny narvu do toho this? Pokud teda nutné ho používat? Jestli si to pamatuju správně, tak mi to házelo nějakou chybu, když jsem se do this snažil vložit obsah jedné proměnné a pak nějaké jiné. Každopádně ale, udělat si v jedné funkci třeba tři proměnné s tím, že s tím pak chci nějak pracovat, podle mě není nesmyslná myšlenka. Vůbec není prostě někde popsáno, jak z té funkce dolovat obsah proměnných, abych je na jiném místě mohl použít. Resp. jak je teda dolovat z toho this. Ty lekce jsou fakt arogantní k času uživatele. Já to hrozně nemám rád, když někdo něco takového někomu dělá.

Avatar
DarkCoder
Člen
Avatar
Odpovedá na Tomáš Prčík
DarkCoder:1. februára 21:37

Třída je šablona která ukazuje jakou strukturu objekt bude mít. Je třeba si uvědomit že pro jednu šablonu může existovat více než jedna instance. Každá instance může mít různé hodnoty v atributech. Pokud je třída jedna, musím ji dát nějak vědět, pro jaký objekt se metoda volá. A k tomu právě slouží to $this.

Podívej se na následující příklad, ve kterém je třída s vícero atributy a metodami. Podívej, jak se pomocí $this přistupuje k atributům instance.

class Postava
{
    private string $jmeno;
    private int $unava;
    private int $energie;
    private int $zdravi;
    private int $penize;

    public function __construct(string $jmeno)
    {
        $this->jmeno = $jmeno;
        $this->unava = 50;
        $this->energie = 100;
        $this->zdravi = 100;
        $this->penize = 0;
    }

    // Odpočinek – ovlivňuje únavu, energii a zdraví
    public function odpocinout(int $doba): void
    {
        $this->unava -= $doba * 10;
        $this->energie += $doba * 5;
        $this->zdravi += $doba * 2;

        $this->unava = max(0, $this->unava);
        $this->energie = min(100, $this->energie);
        $this->zdravi = min(100, $this->zdravi);
    }

    // Práce – používá více atributů pomocí $this
    public function pracovat(int $hodiny): void
    {
        // práce zvyšuje peníze, ale zhoršuje stav postavy
        $this->penize += $hodiny * 150;
        $this->unava += $hodiny * 15;
        $this->energie -= $hodiny * 20;

        if ($this->energie <= 0) {
            $this->energie = 0;
            $this->zdravi -= 10; // vyčerpání škodí zdraví
        }

        $this->unava = min(100, $this->unava);
        $this->zdravi = max(0, $this->zdravi);
    }

    public function vypisStav(): void
    {
        echo "Postava: {$this->jmeno}\n";
        echo "Zdraví: {$this->zdravi}\n";
        echo "Energie: {$this->energie}\n";
        echo "Únava: {$this->unava}\n";
        echo "Peníze: {$this->penize}\n";
    }
}

a použití:

$postava = new Postava("Hrdina");

$postava->pracovat(4);
$postava->odpocinout(2);
$postava->vypisStav();

Co je důležité pro pochopení

$this->atribut = práce s konkrétním atributem konkrétní instance
Při volání metody se do $this dosadí instance pro kterou se metoda volá.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Tomáš Prčík
DarkCoder:1. februára 21:57

Jiný jednodušší příklad:

class Clovek
{
    private string $jmeno;
    private int $vek;

    // metoda, která nastavuje atributy
    public function nastav(string $jmeno, int $vek): void
    {
        $this->jmeno = $jmeno;
        $this->vek = $vek;
    }

    // metoda, která atributy používá
    public function vypis(): void
    {
        echo "Jméno: {$this->jmeno}, věk: {$this->vek}";
    }
}

A použití:

$clovek = new Clovek();

$clovek->nastav("Petr", 20);
$clovek->vypis();

Co je tady vidět (to nejdůležitější)

nastav() mění hodnoty atributů

vypis() čte hodnoty atributů

$this->jmeno a $this->vek vždy znamenají přístup k atributu té konkrétní instance“

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na DarkCoder
Tomáš Prčík:18:47

Zdravím, díky. No, to jste přesně uhodil hřebík na hlavu. Já absolutně nechápu, k čemu tam to this je. Mi ten zápis přijde, jako že postupně do toho this rvu jednu proměnnou po druhé. Ale vždyť to nedává žádný smysl. Ono je to teda nějaký array? Nebo to this pořád dokola v té funkci upravuju? Vždyť v těch funkcích přece můžou bít klidně jenom ty samotné proměnné - jak v klasických funkcích - a jejich hodnoty já si z nich na jiném místě kódu vytáhnu a budu si s nima něco dělat. Žádné this nepotřebuju, ne? Dá se Vám někam zavolat - já si Vás klidně zaplatím, ať mi to vysvětlíte. Jinak je to zase na hodiny lovení po večerech na internetu. Díky. Toto si totiž myslím, že v tom kursu chybí. A bez toho je v těch informacích strašný chaos. Člověk ten kód na konec nějak napíše - tím, že to padesátkrát zkusí, až to jednou vyjde. Ale vůbec tom nerozumí. Díky.

Avatar
DarkCoder
Člen
Avatar
Odpovedá na Tomáš Prčík
DarkCoder:19:15

Pochopení $this je naprosto zásadní k tomu abys porozuměl, jak se přistupuje k atributům nebo metodám daného objektu.

V PHP je $this speciální proměnná, která odkazuje na aktuální instanci objektu (tedy na „tento objekt“).

Používá se uvnitř tříd, když pracuješ s vlastnostmi a metodami objektu.

Základní význam

$this = konkrétní objekt, se kterým právě pracuješ

umožňuje přístup k:

vlastnostem ($this->vlastnost)
metodám ($this->metoda())

Jednoduchý příklad:

class Auto {
    public $barva;

    public function nastavBarvu($barva) {
        $this->barva = $barva;
    }

    public function vypisBarvu() {
        echo $this->barva;
    }
}

$mojeAuto = new Auto();
$mojeAuto->nastavBarvu("červená");
$mojeAuto->vypisBarvu(); // červená

$this->barva znamená barva tohoto konkrétního auta
kdyby existovalo víc aut, každé má svou vlastní $barva

$this vychází přímo ze syntaxe práce s objekty v PHP.

Objekt má atributy (vlastnosti) a metody

$objekt->atribut;
$objekt->metoda();

$this je jen „automaticky dostupná proměnná“

Uvnitř třídy PHP neví, jak se objekt jmenuje zvenku, proto ti dá univerzální jméno:

$this

Takže místo:

$auto->barva;
$auto->nastavBarvu();

Používáš zevnitř objektu:

$this->barva;
$this->nastavBarvu();

Přímé srovnání (venku vs. uvnitř)

class Auto {
    public $barva;

    public function nastavBarvu($barva) {
        $this->barva = $barva; // vnitřek objektu
    }
}

$auto = new Auto();
$auto->nastavBarvu("modrá"); // vně objektu

Kde jsem Jak přistupuji
mimo třídu $auto->barva
uvnitř třídy $this->barva

Uvnitř třídy vždy mluvím o sobě pomocí $this

Bez $this by PHP nevědělo:

kterou metodu na kterém objektu

Takže k zapamatování:

$this přímo vychází ze syntaxe práce s atributy a metodami objektu — jen se používá zevnitř objektu místo názvu proměnné.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Tomáš Prčík
DarkCoder:19:29

Napíšu to ještě jednou, dávej pozor:

Když zavoláš metodu na objektu:

$auto->nastavBarvu("modrá");

a řízení se přesune do definice metody:

class Auto {
    public function nastavBarvu($barva) {
        $this->barva = $barva;
    }
}

tak:

$this automaticky odkazuje na ten objekt ($auto), který metodu zavolal.

$this je reference na instanci objektu, která metodu volá
PHP sváže $this s konkrétním objektem v paměti

Ještě jednou trochu dopodrobna:

Co se reálně v PHP stane

$auto->nastavBarvu("modrá");

PHP najde metodu nastavBarvu ve třídě Auto

Vytvoří call context pro tuto metodu
Do speciální proměnné $this uloží referenci na instanci $auto
Spustí tělo metody

public function nastavBarvu($barva) {
    $this->barva = $barva;
}

Toto si zapamatuj:

Při volání nestatické metody PHP automaticky sváže $this s instancí objektu, na které byla metoda zavolána.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na DarkCoder
Tomáš Prčík:19:36

Zdravím, právě tady nad tím sedím. No, tak to už začíná dávat trochu smysl.

Avatar
DarkCoder
Člen
Avatar
Odpovedá na Tomáš Prčík
DarkCoder:19:42
Stejná třída, dva objekty
class Auto {
    public $barva;

    public function nastavBarvu($barva) {
        $this->barva = $barva;
    }

    public function vypisBarvu() {
        echo $this->barva . PHP_EOL;
    }
}

Dvě instance

$auto1 = new Auto();
$auto2 = new Auto();

Volání stejné metody na dvou objektech

$auto1->nastavBarvu("červená");
$auto2->nastavBarvu("modrá");

Výsledek (důkaz)

$auto1->vypisBarvu(); // červená
$auto2->vypisBarvu(); // modrá

Co to dokazuje

metoda nastavBarvu() je jedna jediná (napsaná jednou)

ale $this->barva:

při volání přes $auto1 znamená $auto1->barva
při volání přes $auto2 znamená $auto2->barva

Můžeš si to číst takhle:

$auto1->nastavBarvu("červená");

// uvnitř metody: $this === $auto1

$auto2->nastavBarvu("modrá");

// uvnitř metody: $this === $auto2

$this se vždy automaticky sváže s instancí, na které byla metoda zavolána, a proto stejný kód pracuje s různými objekty.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na DarkCoder
Tomáš Prčík:19:50

Zdravím, ještě nechci jásat. Ale to následující to hodně objasňuje. Podle mě to v tom kursu mělo být:
Takže místo:

$auto->barva;
$auto->nastavBarvu();
Používáš zevnitř objektu:

$this->barva;
$this->nastavBarvu();

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 41.