BLACK FRIDAY! Slevy až 80 % jsou všude. Tak je nepropásni a přejdi do rostoucího IT oboru!
The real BF 2020

Lekce 3 - Atributy a magické metody v PHP

V minulé lekci, První objektová aplikace v PHP, jsme si vysvětlili jak OOP funguje a vytvořili jsme si první jednoduchou objektovou aplikaci.

Dnes si vysvětlíme atributy a základní magické metody.

Atributy

Naše třída Clovek má zatím pouze metody (dokonce jen jednu). Přidejme jí nějaké atributy. Každý náš člověk bude mít jméno, příjmení a věk. Atributy třídě přidáme následovně:

<?php

class Clovek
{

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

    . . .

Již víme, že atributy fungují jako proměnné, ale náleží objektu. Public před názvem atributu označuje, že je atribut viditelný zvenčí (stejně jako tomu bylo u metody).

Abychom si atributy vyzkoušeli, upravíme si naši metodu pozdrav(). Budeme chtít, aby pozdravila "Ahoj, já jsem " a k tomu dodala hodnotu z atributu $jmeno. Budeme tedy chtít uvnitř metody použít atribut instance. Zajímavá otázka je, kde tu instanci vezmeme, jelikož třída je vzor společný pro všechny objekty daného typu (pro všechny lidi). Řešení je velmi jednoduché, ve třídě můžeme používat klíčové slovo $this. Pod touto proměnnou se skrývá instance, se kterou zrovna pracujeme a na které je tedy metoda volána. Metoda pozdrav bude nyní vypadat následovně:

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

Přesuňme se nyní do index.php, kde tvoříme instanci. Nyní ji nastavíme atributy, které jsme třídě 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 dodejme ještě HTML hlavičku, aby nám aplikace uměla česky. Když ji nyní spustíme, vidíme, že metoda opravdu přistoupila k atributu a vypsala jeho hodnotu.

Your page
localhost

Abychom si vyzkoušeli, že je třída univerzální, vytvořme si ještě Jana. Celý kód indexu včetně HTML bude vypadat 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 aplikace vypadá takto:

Your page
localhost
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Objekty jsou vysoce univerzální komponenty, stačí vytvořit společnou třídu a poté můžeme pracovat s různě nastavenými instancemi různým způsobem. A tím to zdaleka nekončí, uvidíte, že toho umí ještě spoustu.

Magické metody

PHP nám ve třídě umožňuje definovat několik tzv. magických metod. Magických proto, že si je nevoláme my sami (i když samozřejmě také můžeme), ale spouští se v určitých chvílích automaticky. Reagují tedy na určité události. Všechny magické metody začínají na dvě podtržítka. Je jich několik, ale my si zatím zmíníme první 3.

Konstruktor

V našem programu si nejprve vytváříme prázdnou (nenastavenou) instanci člověka a až poté mu nastavujeme jméno, příjmení a věk. To má hned několik nevýhod, zejména:

  1. Lze vytvořit nenastavený objekt a pracovat s ním, což jistě vyvolá chyby, např. při vypsání jména, které není zadané.
  2. Nastavení všech hodnot objektu zabírá zbytečně místo ve zdrojovém kódu.

Tento problém za nás řeší konstruktor. Konstruktor je metoda, která se automaticky spustí při vytvoření instance. Slouží k nastavení vnitřního stavu objektu tak, aby byl připraven k použití. Pokud má naše třída konstruktor, nelze její instanci vytvořit jinak, než právě použitím konstruktoru.

Konstruktor je metoda se jménem __construct() a s libovolným počtem parametrů. Přidejme si ho do naší třídy a jako parametry mu dejme $jmeno, $prijmeni a $vek. Hodnoty z parametrů nastavíme atributům instance:

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

Konstruktor do třídy vložíme za atributy a před ostatní metody. Když nyní naši aplikaci spustíme, tak nebude fungovat. Je to z toho důvodu, že třída má nyní konstruktor a ten vyžaduje určité parametry, které jsme při vytváření instancí nezadali. Vidíme, že nás PHP nenechá vytvořit objekt jinak, než předepisuje konstruktor.

Přejděme do index.php a modifikujme PHP kód do následující 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);
    }

}

První dojem je zvýšení přehlednosti kódu. Vidíme, že ona záhadná závorka za třídou při vytváření její instance slouží k předání parametrů konstruktoru. Konstruktor následně tyto parametry uloží do objektu a tím ho připraví k použití. Využití konstruktoru samozřejmě není omezeno jen na nastavování atributů, můžeme v něm udělat cokoli jako v běžné metodě. Konstruktor můžeme definovat i bez parametrů, např. si v něm někam uložíme čas kdy byla instance vytvořena a podobně.

Destruktor

Pro úplnost si uveďme i destruktor. Jak vás asi napadlo, destruktor je metoda, která se zavolá ve chvíli, když se objekt odstraňuje z paměti. Můžeme zde provést nějaké úklidové práce, které jsou potřeba k uvolnění zdrojů, které objekt využíval. Jelikož skripty v PHP běží jen chvíli a poté se veškerá paměť, kterou skript využíval, uvolní, nemají destruktory příliš velký význam. Přesto je můžeme využít např. k uložení dat do databáze před zrušením nějakého objektu nebo databáze může před zrušením ukončit databázové spojení a podobně. Vy v současné době destruktor asi nevyužijete, ale patří ke konstruktoru, tak proč si ho nevyzkoušet.

Metoda destruktoru se jmenuje __destruct(). Vypišme v ní hlášku o tom, že se objekt odstranil z paměti:

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

Když nyní aplikace spustíme, uvidíme, že úplně na konci se vypíše 2x hláška "Byl jsem odstraněn z paměti.".

Your page
localhost

Hlášku vypíší před svým zničením $karel a $jan, k jejich odstranění z paměti dojde až při ukončení aplikace nebo přesněji ve chvíli, když je již nemá smysl uchovávat.

Destruktor můžeme z naší třídy zase odebrat.

ToString

Magická metoda __toString() se spouští ve chvíli, kdy chceme objekt převést na textový řetězec, nejčastěji tedy když ho chceme vypsat. Schválně si zkuste nyní vypsat objekt $karel:

echo($karel);

PHP vám vyhodí chybu, jelikož není definované jakým způsobem se mají lidé vypisovat. Lidé jsou objekty, které mají několik vlastností, PHP jednoduše neví které z nich vypsat. Doplňme tedy do naší třídy Clovek metodu __toString(), která bude vracet atribut jméno.

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

Pokud se nyní znovu pokusíme Karla nebo Jana vypsat, vypíše se jednoduše jejich jméno.

Konstruktory nám umožňují provádět tzv. zapouzdření - o tom ale jindy :). Dnešní projekt máte jako vždy v příloze spolu se zdrojovými kódy.

V následujícím cvičení, Řešené úlohy k 1.-3. lekci OOP v PHP, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Stáhnout

Staženo 1267x (765 B)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
První objektová aplikace v PHP
Všechny články v sekci
Objektově orientované programování (OOP) v PHP
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
55 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (18)

 

 

Komentáře

Avatar
Amomym
Člen
Avatar
Amomym:2.8.2013 18:25

Už se těším na pokračování :D, tento seriál tutoriálů je fakt perfektní :D

 
Odpovědět
2.8.2013 18:25
Avatar
Kit
Redaktor
Avatar
Kit:2.8.2013 18:42

Destruktor v PHP slouží úplně k jinému účelu než v Javě nebo C# a dokonce na rozdíl od nich funguje. Zkus si spustit tenhle kód:

<?php
class Destr{
    function __construct($jmeno) {
        $this->jmeno = $jmeno;
        echo "Vytvářím objekt $this->jmeno\n";
    }

    function __destruct() {
        echo "Mažu objekt $this->jmeno\n";
    }

}

$obj = new Destr("Adam");
$obj = new Destr("Eva");
$obj = new Destr("Jana");
$obj = new Destr("Ivana");

Tohle je důvod, proč PHP nepotřebuje "finally".

Odpovědět
2.8.2013 18:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:2.8.2013 18:49

Pěkný článek :) Jen by mě zajímalo, kde přišli k názvu Magické metody :D

Odpovědět
2.8.2013 18:49
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:2.8.2013 19:00

To je oficiální označení
http://php.net/…p5.magic.php
a některé jsou hodně užitečné, například v šablonách

Odpovědět
2.8.2013 19:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Kit:2.8.2013 19:13

A ještě něco: Metoda __destruct() vůbec neříká nic o tom, že byl objekt odstraněn z paměti. Pouze se stane nedostupný. Fyzicky ho odstraní až GC, ale často skript skončí dřív, než se GC dostane ke slovu. Destruktory se však provedou vždy.

Odpovědět
2.8.2013 19:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Neaktivní uživatel:2.8.2013 19:29

Velice kvalitní návod, jen bych ještě dodal self:: vedle $this.

Odpovědět
2.8.2013 19:29
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:2.8.2013 19:34

self:: se většinou nepoužívá. Rozumní programátoři se mu vyhýbají.

Odpovědět
2.8.2013 19:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:2.8.2013 19:58

Na to radši odpovídat nebudu, jinak se to zase zvrtne v boj o statiku.

Odpovědět
2.8.2013 19:58
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:2.8.2013 20:04

Snad tě potěší, že v PHP 5.3 přibyla magická metoda __callStatic().

Odpovědět
2.8.2013 20:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:2.8.2013 20:19

Moc výhod sice nevidím, ale uvítám každou novou možnost. Hlavně by se spíš měli zbavit funkcí typu mysql_, str_ a hlavně těch hrozně pojmenovaných funkcí a vytvořit na ně třídy, String::toLower().

Odpovědět
2.8.2013 20:19
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:2.8.2013 21:02

Však mysql_ bylo nahrazeno už dávno, ale na metody pro stringy se stále čeká.

Odpovědět
2.8.2013 21:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:2.8.2013 21:03

Pevně doufám, že se dočkáme. Destruktor upřesním.

Odpovědět
2.8.2013 21:03
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:2.8.2013 21:10

__callStatic() ti umožní napsat hromadu primitivních metod typu String::toLower() do jedné přehledné metody. Celou používanou stringovou knihovnu si takhle můžeš přepsat do jediné metody, která bude mít 10-40 řádek. Osobně bych však dal přednost dynamické metodě, tedy __call().

Odpovědět
2.8.2013 21:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:2.8.2013 21:18

Moment, moment, jestli tohle jde, tak se mi asi výrazně zvýší životní úroveň :D Jsou to tedy magické metody pro metody předpokládám.

Odpovědět
2.8.2013 21:18
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:2.8.2013 21:40

Myslíš tohle?

<?php
mb_internal_encoding('UTF-8');

class Str {
    public static function __callStatic($fun, $args) {
        switch (strtolower($fun)) {
            case 'len' : return mb_strlen($args[0]);
            case 'tolower' : return mb_strtolower($args[0]);
            case 'toupper' : return mb_strtoupper($args[0]);
        }
        throw new Exception('Nedefinovaná funkce '.__CLASS__.'::'.$fun);
    }
}

var_dump(Str::len('Žluťoučký'));
var_dump(Str::toupper('Žluťoučký'));
var_dump(Str::tolower('Žluťoučký'));
Editováno 2.8.2013 21:43
Odpovědět
2.8.2013 21:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:2.8.2013 22:05

Pardon, u mysql_ jsem chtěl napsat, že to stále spousta lidí využívá, i když už tu máme mysqli, PDO, Dibi...

Vím co dělá funkce __callStatic, docela užitečná, ale řekněme si upřímně - kde jinde ji použijeme než u prostých knihoven vázajících do sebe opotřebované PHP funkce, nebo datové členy.

Odpovědět
2.8.2013 22:05
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:2.8.2013 22:06

Asi si napíšu pár takových knihoven (String, Int, Math...), protože ty PHP funkce jsou vážně... :D

Odpovědět
2.8.2013 22:06
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:2.8.2013 22:37

S názvem String bych byl opatrný, editor mi ho označil jako používaný (možná rezervovaný) identifikátor. Nevím, k čemu bude třída Int a Math se mi také moc nezdá. Pokud je v další verzi PHP použijí jako identifikátory tříd, budeš mít problém.

Odpovědět
2.8.2013 22:37
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:2.8.2013 22:43

Funkce mysql_ se dají velmi snadno odinstalovat, jsou jen volitelným doplňkem PHP. Ve verzi 5.5 je tato knihovna deprecated a v dalších verzích nebude.

Proto také v případě potřeby dám přednost metodám __call(), __get() a __set().

Odpovědět
2.8.2013 22:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:3.8.2013 6:31

Zvláštní, mě to editor neoznačuje. Mno zkrátka třídy nahrazující PHP funkce (asi vezmu z jiných jazyků). Jestli je použijou jako identifikátory, tak je buď přejmenuju, nebo je odstraním. To není takový problém, však.

Tak ono to stačí nepoužívat. Jen je smutný, že když jdu na fórum programujte.com, tak tam úplně všichni používají mysql_. Nevím, zdá se mi, že na devbooku jsou více učený v oboru a tohle prostě nepovažuju za kód:

$sql = mysql_query ("SELECT * FROM tabulka ORDER by cas LIMIT 1,6");

while ($z = mysql_fetch_assoc($sql))
{

}

(Právě jsem vzal z programujte.com)

Odpovědět
3.8.2013 6:31
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:5.8.2013 10:08

Já nevím, ale tato magie mi připadá zbytečná. Asi proto se mi nelíbil jazyk Ruby. Raději napíši klasický wrapper, bude to fungovat stejně a dost možná i rychleji.

Odpovědět
5.8.2013 10:08
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:5.8.2013 10:55

Tato magie je nezbytná, pokud potřebuješ ze šablony zavolat nějakou metodu některého objektu. Bez té magie to jde jen hodně nešikovně a musíš přitom šablonu roztrhnout např. na hlavičku, tělo a patičku.

Odpovědět
5.8.2013 10:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:5.8.2013 11:00

Proč bych z šablony nemohl zavolat metodu objektu? Prostě si tam předám ten objekt, nač to komplikovat. Navíc v šablonách vypisuji jen proměnné, co si tam předám, maximálně používám statické helpery.

Odpovědět
5.8.2013 11:00
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:5.8.2013 11:07

Musel bych tu šablonu nějak přerušit, např. <?=, {, tečkami apod. Bez přerušení můžeš přímo vkládat pouze proměnné, objekty a proměnné objektů.

Odpovědět
5.8.2013 11:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:5.8.2013 11:11

PHP má to přerušování perfektně navržené, není důvod ho nepoužít.

Odpovědět
5.8.2013 11:11
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:5.8.2013 11:18

Jenže pak už spojuješ řetězce a má to určitý dopad na výkon. Kromě toho to už nevypadá tak hezky.

Stejně do šablony vkládám jen celé objekty. Na metody ani proměnné objektu se zpravidla neodkazuji.

Odpovědět
5.8.2013 11:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:5.8.2013 11:27

Magické metody mají také obrovský dopad na výkon, doporučuje se je nepoužívat.

Odpovědět
5.8.2013 11:27
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na Kit
Neaktivní uživatel:5.8.2013 11:27

Další výhoda Smarty. :)

Odpovědět
5.8.2013 11:27
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:5.8.2013 11:28

Další nevýhoda Smarty :)

Odpovědět
5.8.2013 11:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:5.8.2013 11:31

Zkoušel jsem kombinovat různou délku a počty řetězců. Magické metody přitom vycházely někdy až řádově rychlejší než Smarty.

Odpovědět
5.8.2013 11:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:5.8.2013 11:33

Ty tvoje testy bych někdy chtěl vidět. :)

Odpovědět
5.8.2013 11:33
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:5.8.2013 11:40

Když jsem některé své benchmarkové testy poslal sem, byla kolem toho jen hromada zbytečných keců. Kromě toho jsem je už smazal společně se Smarty.

Smarty je jen další jazyk v jazyku, který jen znepřehledňuje zápis šablony. Nevidím žádný přínos Smarty, všechno se v tom dělá obtížněji než přímo v PHP.

Editováno 5.8.2013 11:41
Odpovědět
5.8.2013 11:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:5.8.2013 11:46

No dobrá, očividně máme každý úplně jiný názor.

Odpovědět
5.8.2013 11:46
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:5.8.2013 12:09

Tak všechno vychází rychleji než Smarty, když je to interpret v interpretu :)

Odpovědět
5.8.2013 12:09
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Neaktivní uživatel:5.8.2013 12:18

Při prvním spuštění je Smarty nadměrně pomalé, ale při dalších už to tak velký rozdíl není. Navíc neobsahuje PHP syntaxy, takže pro webdesignéra je jednoduché web upravit. U větších šablon (menší šablony jsou stejně k ničemu) je Smarty rychlé dost, oproti ostatním šablonovacím systémům, které zaostávají u větších šablonách.

Odpovědět
5.8.2013 12:18
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Neaktivní uživatel
David Čápka:5.8.2013 12:35

Je pravda, že se to cachuje, takže je to pak rychlé stejně. Jenže celá ta sranda se dá prostě nahradit naprosto minimalistickým řešením, které funguje úplně stejně.

Odpovědět
5.8.2013 12:35
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Neaktivní uživatel:5.8.2013 12:45

Funguje možná, ale nevypadá stejně. Pak například by se musel webdesignér naučit alepsoň základy PHP, aby mohl upravit šablonu.

Odpovědět
5.8.2013 12:45
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Neaktivní uživatel
David Čápka:5.8.2013 13:03

V šabloně se objevují jen názvy proměnných nebo helperů, stačí se naučit tedy jak se tam vkládají, stejně jako se to musí naučit ve Smarty.

Odpovědět
5.8.2013 13:03
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na David Čápka
Neaktivní uživatel:5.8.2013 13:06

Ve Smarty stačí vynechávat vše, co je v {}. Řekl bych, že je to i mnohem přehlednější, než klasické PHP. Navíc argumenty typu "nová syntaxe" se dají lehce shodit ze stolu, protože Smarty má podobnou syntaxy jako PHP:

if($user->isLogged())
{
?>
    <p>Ahoj</p>
<?php
}
{if $user->isLogged()}
<p>Ahoj</p>
{/if}
Odpovědět
5.8.2013 13:06
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Neaktivní uživatel
David Čápka:5.8.2013 13:34

Správně to je takhle:

<?php if ($user->isLogged()): ?>
<p>Ahoj</p>
<?php endif ?>

Je to tedy stejné jako ve Smarty a stačí také jen ignorovat závorky, zde špičaté.

Odpovědět
5.8.2013 13:34
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Neaktivní uživatel
David Čápka:5.8.2013 13:34

Jinak je blbost mít předaný v šabloně takovýhle objekt, to má tahat controller, takže šablona bude jen:

<?php if ($userLogged): ?>
<p>Ahoj</p>
<?php endif ?>
Odpovědět
5.8.2013 13:34
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Neaktivní uživatel:5.8.2013 13:51

O moc delší a nepřehlednější. Není to blbost a byl to jen příklad. Mno to je jedno, nechci tu další diskuzi o Smarty, já stojím za ním. :)

Odpovědět
5.8.2013 13:51
Neaktivní uživatelský účet
Avatar
Odpovídá na David Čápka
Neaktivní uživatel:5.8.2013 13:51

Chtěl jsem jen ukázat, že syntaxe Smarty je stejná jako PHP.

Odpovědět
5.8.2013 13:51
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Neaktivní uživatel
David Čápka:5.8.2013 13:57

No právě a proto se je musí ten kodér učit úplně stejně. Jak jsi to napsal předtím by to asi nefungovalo, v šablonách se používá jiná direktiva, kterou evidentně neznáš, proto asi používáš Smarty. Hodně lidí o ní neví.

EDIT: Kupodivu to přerušení bloku funguje, ale takhle se to opravdu nedělá.

Editováno 5.8.2013 13:59
Odpovědět
5.8.2013 13:57
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:5.8.2013 14:00

Do šablony logiku nedávám, takže bych měl jen

$pozdravPrihlaseneho

nebo

$user->pozdrav
Odpovědět
5.8.2013 14:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Petr Nymsa:5.8.2013 14:44

Sice se v tom moc nevyznám ale přijde mi opravdu zbytečný zavádět nějakou jinou syntaxi. Klasická šablonová syntaxe PHP je možná tak o 4 znaky delší.. to zas tolik není :)

Odpovědět
5.8.2013 14:44
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na David Čápka
Neaktivní uživatel:5.8.2013 15:47

PHP šablonovací syntax znám jen okrajově, ale přece vidím, jak je nepřehledná.

Kit: samozřejmě. :)

Zirko: Ono nejde ani tak o délku, i když ta tam taky hraje roli.

Odpovědět
5.8.2013 15:47
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Neaktivní uživatel
David Čápka:5.8.2013 15:54

IMHO je lepší když jsou v HTML šabloně špičaté závorky než nějaký paskvil, ale to je věc názoru. Každopádně to lze zapsat velmi podobně a je to delší jen o pár znaků v té sekvenci.

Odpovědět
5.8.2013 15:54
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Neaktivní uživatel:5.8.2013 15:57

Mě se líbí syntaxe Smarty. Navíc je potom rychlejší přejít na syntaxy Latte.

Odpovědět
5.8.2013 15:57
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:5.8.2013 19:02

Než špičaté závorky, raději žádné. Nedávám je tam vůbec. Proměnné a objekty vkládám do šablony přímo.

Odpovědět
5.8.2013 19:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:5.8.2013 19:11

Taky možnost.

Odpovědět
5.8.2013 19:11
Neaktivní uživatelský účet
Avatar
Uživatel sítě :9.2.2014 13:23

Funguje POST globálně pro OOP? Či je také musím předávat kostruktorem?

Odpovědět
9.2.2014 13:23
Chybami se člověk učí, běžte se učit jinam!
Avatar
Radomír Panna:31.7.2014 13:46

Trošku zrada. Jako začátečník v OOP zkouším a nějak nerozumím tomu constructoru. Podle článku to nebude fungovat, pokud constructor nezadám přesně:
'$karel = new Clovek('Karel', 'Novak', 36);
Funguje to. Netuším, kde hledat chybu.
Díky

 
Odpovědět
31.7.2014 13:46
Avatar
Odpovídá na Radomír Panna
Martin Konečný (pavelco1998):31.7.2014 14:21

Konstruktor přijímá nějaké parametry. Pokud mu žádné nepošleš, tak program skončí chybou.
Tzn. skončí to chybou, pokud napíšeš třeba jen tohle:

$karel = new Clovek();
Odpovědět
31.7.2014 14:21
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Radomír Panna:31.7.2014 18:30

Právě, že to neskončilo žádnou chybou a vypsalo mi to stejnou hlášku jako bez konstruktoru

 
Odpovědět
31.7.2014 18:30
Avatar
Odpovídá na Radomír Panna
Martin Konečný (pavelco1998):31.7.2014 18:37

Jakou hlášku?

Pokud to máš nějak takto:

class Clovek
{

  public function __construct($promenna, $promenna)
  {
     ...
  }

}

tak ti

$karel = new Clovek();

musí hodit chybu. Zkus na začátek hodit

error_reporting(E_ALL);
Odpovědět
31.7.2014 18:37
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Radomír Panna:1.8.2014 8:01

V souborech mám v tuto chvíli:

<?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, ja jsem ' . $this->jmeno);
    }
}
<?php
require_once('tridy/Clovek.php');
$karel = new Clovek();

$karel->pozdrav();
?>

Celé mi to pak vypíše tohle: Ahoj, ja jsem
I když přidám error_reportin­g(E_ALL); neudělá mi to žádnou změnu. Buď mám špatně nastaveno na locale php nebo dělám někde chybu a nevidím ji.

Editováno 1.8.2014 8:02
 
Odpovědět
1.8.2014 8:01
Avatar
Radomír Panna:1.8.2014 8:05

Tak chyba bude někde v nastavení php. Ještě jsem to vyzkoušel nahodit na hosting a tam už se chyby ozývají. Poradí prosím někdo, co tedy nastavit, aby to bylo ok i na locale? Díky

 
Odpovědět
1.8.2014 8:05
Avatar
Odpovídá na Radomír Panna
Martin Konečný (pavelco1998):1.8.2014 11:30

Radím spíš naslepo, protože se v tomhle taky moc nevyznám, ale můžeš zkusit ještě tohle:

ini_set('display_errors', '1');
Odpovědět
1.8.2014 11:30
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Dominik Gavrecký:4.7.2015 0:32

Nerozumiem tomu publicu ... Kedy ho používať pretože vidno ho z vonku je vážne skrátene vysvetlenie.

Odpovědět
4.7.2015 0:32
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Odpovídá na Dominik Gavrecký
Martin Konečný (pavelco1998):4.7.2015 0:35

Public se používá v podstatě ve dvou případech:

  1. hodnotu vlastnosti nastavujeme odjinud (třeba z jiného objektu)
  2. jsme líní psát settery a gettery

V určitých případech je to i nutné kvůli nějaké magii, ale to je na trochu jiném levelu

Odpovědět
4.7.2015 0:35
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Ondřej Štorc
Redaktor
Avatar
Odpovídá na Dominik Gavrecký
Ondřej Štorc:4.7.2015 0:38

Čemu na tom nerozumíš když máš například tuhle třídu:

class Clovek {
     public $jmeno;
     private $pohlavi

Tak můžeš udělat tohle:

$ondra = new Clovek();
echo($ondra->jmeno);

ale už nemůžeš udělat tohle:

$ondra = new Clovek();
echo($ondra->pohlavi);
Odpovědět
4.7.2015 0:38
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovídá na Ondřej Štorc
Dominik Gavrecký:4.7.2015 6:33

Dakujem toto mi celkom pomohlo ...

Odpovědět
4.7.2015 6:33
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Bebbana
Člen
Avatar
Bebbana:2.10.2015 1:46

Tak jsem se zasekla :(
Clovek.php :

<?php

    class Clovek
    {

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

a index.php:

!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <?php
        require_once('tridy/Clovek.php');

        $karel = new Clovek();
        $karel->jmeno = 'Karel';
        $karel->prijmeni = 'Novák';
        $karel->vek = 30;
        $karel->pozdrav();
    ?>
    </body>
</html>

A po spuštení mi to vypíše jenom: "Ahoj, já jsem" a nic víc. Přitom mám vše přesně jak v článku, třídu Člověk ve složce tridy a zkoušela jsem to jak na localhostu, tak na endoře, výsledek stejnej. Díky za radu.

 
Odpovědět
2.10.2015 1:46
Avatar
Jakub Novák
Člen
Avatar
Odpovídá na Bebbana
Jakub Novák:2.10.2015 2:12

Tak sem asi posíláš jiný kód, protože tenhle je funkční.

Zkus tohle :

<?php

class Person
{
        /** @var string */
        private $name;

        /** @var string */
        private $surname;

        /** @var string */
        private $age;

        public function sayHello()
        {
                print("Hi, I'm $this->name $this->surname and I'm $this->age years old.");
        }

        public function __set($var, $value)
        {
                $this->$var = $value;
        }

        public function __get($var)
        {
                return $this->$var;
        }
}
?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <?php

        $person = new Person();
        $person->name = "Karel";
        $person->surname = "Novák";
        $person->age = 21;
        $person->sayHello();
    ?>
    </body>
</html>

V budoucnu místo 30ti public vars můžeš použít magické metody GET a SET, stejně jako jsem použil já teď (nebude našeptávač). Víc si o tom můžeš přečíst třeba tady http://php.net/…p5.magic.php. Je určitě dobré vědět, že existujou a nenarušovat zapouzdření objektů + můžeš místo magických metod používat vlastní gettery a settery. Co si ale budeme nalhávat, skoro každý programátor používá public vars protože to jsou líný čuníci (včetně mě) a každý řádek navíc je zbytečná ztráta času.

 
Odpovědět
2.10.2015 2:12
Avatar
Odpovídá na Radomír Panna
pradedadedymraze:23.4.2016 1:12

Nic ti to nepíše, protože vytváříš karla a voláš konstruktor bez parametru

$karel = new Clovek();

- tedy vytvoříš objekt karel ale nenastavíš jméno, příjmení ani věk. Musíš to volat takto:

$karel = new Clovek("Arnošt","Pátek",30);
 
Odpovědět
23.4.2016 1:12
Avatar
pradedadedymraze:23.4.2016 1:13

Jinak celkem pěkně se tyhle pokusy ladí třeba zde: http://www.runphponline.com/

 
Odpovědět
23.4.2016 1:13
Avatar
Pavel Parma
Člen
Avatar
Odpovídá na Jakub Novák
Pavel Parma:23.4.2016 2:10

Ohledně těch našeptávačů, PhpStorm povoluje annotace, které pomáhají určit i magicky nastavené proměnné. Je to @property-read @property-write a @property (ta je read i write), annotace následuje datovým typem a pak názvem attributu jako proměnné (např. $foo). Existuje dokonce i annotace pro magicke metody @method. Tady máte kdyžtak seznam používaných annotací, jelikož je to pro php jen nevyužívaný string, vytažitelný reflekcí, záleží na konkrétním IDE, zda je využívá nebo ne.

https://manual.phpdoc.org/…rty.pkg.html

 
Odpovědět
23.4.2016 2:10
Avatar
Adam Černohous:11.1.2017 10:24

Musím vždycky ve třídě definovat její atributy, když mám konstruktor, který se o to postará? Protože to funguje i bez nich.

Např.:

public $firstname; // atributy tridy, funguje to bez nich
public $lastname; // atributy tridy, funguje to bez nich
public $age; // atributy tridy, funguje to bez nich

public function __construct($firstname, $lastname, $age) {
    $this->firstname = $firstname;
    $this->lastname = $lastname;
    $this->age = $age;

    }

Díky moc!

 
Odpovědět
11.1.2017 10:24
Avatar
Pavel Bartoš:24.7.2017 9:17

Ahoj chtěl bych se zeptat, jestli je možné používat v těle třídy funkci, která si bere jako parametr proměnnou, jelikož jsem tu zatím viděl jen případy, kdy se používá některá proměnná z atributů třídy a to napevno až v samotnem těle funkce... A může-li být ta proměnná z přijatá z vnějšku třídy, nebo musí být uvnitř třídy. A jestli musí, tak jestli musí být public, nebo private.

Např:
$cislo=10;
$Pocitacka= new pocitacka();
$pocitacka->pocitej($cislo);

Šlo by to nebo ne?
Díky :-)

 
Odpovědět
24.7.2017 9:17
Avatar
Jiří Zeman
Člen
Avatar
Jiří Zeman:1.10.2017 18:09

Chci se jen zeptat. Až bych dělal někdy nějaký projekt.... Používají se tam Destruktory? Takhle jako začátečníkovi mi to přijde celkem i zbytečné ho používat. Ale určitě bych chtěl slyšet nějakou odpověz od zkušeného PhP-čkaře.

Odpovědět
1.10.2017 18:09
Chybami se člověk učí.
Avatar
Jan Lupčík
Super redaktor
Avatar
Odpovídá na Jiří Zeman
Jan Lupčík:1.10.2017 18:17

Zatím jsem používal destruktor jen jednou, a to když jsem potřeboval něco udělat po výpisu a zobrazení dat.

Odpovědět
1.10.2017 18:17
TruckersMP vývojář
Avatar
pmaly
Člen
Avatar
Odpovídá na Adam Černohous
pmaly:1.3.2018 22:13

Definice atributů
Konvence říká, že všechny atributy by měly být definovány na začátku definice třídy.

 
Odpovědět
1.3.2018 22:13
Avatar
Matěj Bína
Člen
Avatar
Matěj Bína:16.3.2019 18:02

V textu to nevidím, ale jestli jsem to pochopil správně: když vytvořím atribut

public $neco;

tak se do něj dostanu skrz

$this->neco;
nebo
$instance->neco;

Nějak mě mate absence $ za ->, ale asi se s tím budu muset smířit.

Editováno 16.3.2019 18:03
 
Odpovědět
16.3.2019 18:02
Avatar
Odpovídá na Matěj Bína
Michal Šmahel:16.3.2019 23:11

Ano, je tomu tak. Chápeš to správně.

Odpovědět
16.3.2019 23:11
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 75 zpráv z 75.