Veľkonočná akcia je tu a s ňou aj extra kredity ZADARMO na náš interaktívny e-learning. Dobij si teraz kredity a posuň sa vo svojej kariére vpred!
Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – 14. diel - Interface (rozhranie 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
Avatar
Odpovedá na Vít Cigánek
Martin Konečný (pavelco1998):15.10.2015 17:39

Třída implementující nějaký interface říká, že má nějakou funkčnost (něco umí). Pro příklad

interface IMovable
{

        public function move();

}

class Human implements IMovable
{

        public function move()
        {
                echo "step step step...";
        }

}

class Bird implements IMovable
{

        public function move()
        {
                echo "I'm flying...";
        }

}


// nyní je mi jedno, jestli objekt bude instancí třídy Human nebo Bird, protože vím, že daný objekt se umí pohybovat
if ($cond) {
        $obj = new Human();
} else {
        $obj = new Bird();
}

$obj->move();

Dá se to použít i pro zjištění, zda daný objekt danou funkčnost umí

if ($obj instanceof IMovable) {
        // teď 100% víme, že objekt obsahuje metodu move()
}
Odpovedať
+1
15.10.2015 17:39
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Vít Cigánek:15.10.2015 19:06
if ($obj instanceof IMovable) {
        // teď 100% víme, že objekt obsahuje metodu move()
}

Dobře tenhle kód ma smysl, ale ty dvě funkce se dají odpálit i když to není v rozhraní. Kromě toho podmínka platí

if ($obj instanceof IMovable) platí i když jsem zakomentoval fuknci v rozhraní

interface IMovable
{

    //    public function move();

}

navic IMovable je kličové slovo tak jsem to rozhrani musel přjemenovat na IMove

dále vůbec nevím jak by se zaházelo s atritbuty daného interface.

Abstraktní třídu chápu ale interface prostě ne, hlavně bych čekal že když zakomentuju fukci

public function move();

že mi podmínka

if ($obj instanceof IMovable)

vratí false a to se nestalo.

Nebo bych čekal že se

$obj->move();

neprovede. Ani jedno se nestalo. Interface mi připada pořád zbytečný.

 
Odpovedať
15.10.2015 19:06
Avatar
Odpovedá na Vít Cigánek
Martin Konečný (pavelco1998):15.10.2015 21:11

Tady jde o to, že ty nemusíš vůbec vědět, o jakou třídu jde, ale stačí ti, že implementuje dané rozhraní (které říká, že ta třída musí mít danou metodu/y).

Zkusim trochu jiný příklad. Představ si objekt, který bude někam ukládat data. Můžeš je ukládat např. do databáze MySQL, do textového souboru, do paměti atd. Pak to zjednodušeně může vypadat třeba takhle

interface IDataStorable
{

        public function save($key, $value);

        public function delete($key);

        public function load($key);

}

// jelikož třídy implemetují rozhraní, musí obsahovat všechny tři metody
class MySQLStorage implements IDataStorable
{

        public function save($key, $value)
        {
                mysql_query("INSERT INTO tabulka (...)");
        }

        public function delete($key)
        {
                mysql_query("DELETE FROM tabulka ...");
        }

        public function load($key)
        {
                mysql_query("SELECT data FROM tabulka WHERE $key ...");
        }

}


class FileStorage implements IDataStorable
{
        private $file;

        public function __construct()
        {
                $this->file = fopen("nějaký soubor");
        }

        public function save($key, $value)
        {
                fwrite($this->soubor, $value);
        }

        public function delete($key)
        {
                // něco na smazání ze souboru
        }

        public function load($key)
        {
                // něco na získání dat ze souboru
        }

}


class MemoryStorage implements IDataStorable
{

        private $data = array();

        public function save($key, $value)
        {
                $this->data[$key] = $value;
        }


        public function delete($key)
        {
                unset($this->data[$key]);
        }


        public function load($key)
        {
                return $this->data[$key];
        }

}

define("DEBUG", TRUE);
if (DEBUG) {
        // pro testovací účely
        $storage = new MemoryStorage();
        $storage->save("test", "nějaká hodnota");
} else {
        // ostrá DB
        $storage = new MySQLStorage();
}

// zde v kódu už vůbec nemusím řešit, jestli se jedná o nějaký debug nebo ne
// protože vím, že ať je to objekt pracující s databází MySQL nebo jen s pamětí,
// musí obsahovat tři výše uvedené metody
// takže nemusim dávat hromadu dalších podmínek a snadno použít
echo $storage->load("test");

Je to jen malý hloupý příklad, v reálu by to bylo trochu jinak, ale pro pochopení je to snad dostačující.

Odpovedať
+1
15.10.2015 21:11
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Vít Cigánek:16.10.2015 12:59

V podstatě je to šablona pro třídy co musí obsahovat za metody. Co jsem se dočetl tak atributy rozhraní neobsahuje. V praxi to podle mě jde i bez rozhraní. Možná je to pro přehlednost ve třídách je lepší když ve třídě kde je více metod(abych na metodu rozhraní nezapomněl). Jde prostě o to aby se neopomněla nějaká metoda.

 
Odpovedať
16.10.2015 12:59
Avatar
Vít Cigánek:23.11.2015 20:25

Mám takový dotaz, jestli to chápu dobře, tak interface musí mit metody vždy public. Když jsem dal private tak mi to vyhubovalo.

 
Odpovedať
23.11.2015 20:25
Avatar
mv
Člen
Avatar
Odpovedá na Vít Cigánek
mv:23.11.2015 20:39

Ano musí :) Základní myšlenka rozhraní je, že se k němu bude přistupovat zvenčí, privátní metody nemají smysl.

 
Odpovedať
23.11.2015 20:39
Avatar
Petr Šauer
Člen
Avatar
Petr Šauer:27.1.2016 15:32

Tak tady jsme se fakt kousnul :-S , jak určím z jaké třídy je metoda "programuj" ?

interface Programator
{
    public function programuj();
}
 
Odpovedať
27.1.2016 15:32
Avatar
Odpovedá na Petr Šauer
Patrik Valkovič:27.1.2016 15:39

Jak z jaké třídy? Třída je nad rozhraním. První definuješ rozhraní, potom teprve třídu. Tebe nemusí zajímat, jakou třídu máš, pro tebe je důležité, že implementuje požadované rozhraní.

Odpovedať
+1
27.1.2016 15:39
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Petr Šauer
Člen
Avatar
Odpovedá na Patrik Valkovič
Petr Šauer:28.1.2016 10:32

... impementací interface do třídy zajistím to že daná třída bude obsahovat metody přdepsané v interface ? Všechny třídy které implementují interface "IProgramator" budou mít (až je tam dopíšu) stejné metody (např. "pracuj" , "programuj"), je to tak?

 
Odpovedať
28.1.2016 10:32
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovedá na Petr Šauer
Jindřich Máca:28.1.2016 10:47

Ahoj, je to přesně tak. :-)

 
Odpovedať
+1
28.1.2016 10:47
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 22.