PHP týden Předvánoční slevová akce
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

Lekce 10 - Třídní prvky v PHP podruhé - konstanty

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Statika v PHP, jsme si uvedli statiku a ukázali dvě její praktická využití. Dnes v PHP tutoriálu budeme v podobném duchu pokračovat a řekneme si ještě více o třídních prvcích.

Ověření hesla

Rozšiřme ještě náš příklad z minula. Dejme tomu, že se naši lidé registrují do nějakého systému. Kromě svého jména zadávají ještě heslo. Než člověka vytvoříme, je nutné heslo ověřit, zda není moc krátké.

Metoda k ověření délky hesla k člověku logicky patří. Ve chvíli, kdy heslo ověřujeme (např. z formuláře) ale ještě nemáme člověka vytvořeného. Abychom ho vytvořili, potřebujeme znát jméno, příjmení, věk a heslo, jelikož člověk je vyžaduje v konstruktoru. Abychom však zavolali metodu pro ověření hesla, potřebujeme mít vytvořenou instanci člověka. Problém vyřešíme tak, že metodu k ověření hesla napíšeme jako statickou. Tak ji budeme moci zavolat i bez instance a zároveň bude logicky zařazena ve třídě Clovek, kam patří.

Ověření je značně zjednodušené, v reálu by se ověřovalo zda heslo neobsahuje diakritiku a podobně. Třídě Clovek přidáme privátní instanční proměnnou $heslo. Proč je $heslo privátní snad nemusím vysvětlovat.

private $heslo;

Dále upravíme konstruktor tak, aby se uživatel mohl vytvořit jen se zadaným heslem:

public function __construct($jmeno, $prijmeni, $vek, $heslo)
{
    $this->jmeno = $jmeno;
    $this->prijmeni = $prijmeni;
    $this->vek = $vek;
    self::$pocetLidi++;
    $this->id = self::$pocetLidi;
    $this->heslo = $heslo;
}

Podobně upravte i konstruktor Javisty z minulých lekcí, aby se nám nerozbil, ještě ho budeme potřebovat.

Heslo by se mělo nějaký způsobem hashovat, nyní to pro jednoduchost zanedbáme, podrobněji se to řeší v dalších seriálech. Třídě nakonec přidejme statickou veřejnou metodu validniHeslo():

public static function validniHeslo($heslo)
{
    return (mb_strlen($heslo) >= 5);
}

Metoda vrátí true pokud je délka hesla větší než 5 znaků, jinak vrátí false. Až na použití funkce mb_strlen() v ní není nic zajímavého. Asi víte, že funkce mb_strlen() umí na rozdíl od zastaralé strlen() pracovat s kódováním UTF-8. Kódování pro tyto funkce však musíme v indexu nastavit. Někam na začátek tedy přidejme:

mb_internal_encoding("UTF-8");

Více informací o funkci naleznete v českém PHP manuálu.

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

V indexu si zkusíme jednoduše realizovat scénář registrace nového člověka do systému:

$heslo = 'heslojeveslo';
if (Clovek::validniHeslo($heslo))
{
    $clovek = new Clovek('Jan', 'Novák', 32, $heslo);
    echo('Heslo OK');
}
else
    echo('Heslo musí být dlouhé minimálně 5 znaků');

class Clovek
{

    public $jmeno;
    public $prijmeni;
    public $vek;
    private $unava = 0;
    public $id;
    private static $pocetLidi = 0;
    private $heslo;

    public function __construct($jmeno, $prijmeni, $vek, $heslo)
    {
        $this->jmeno = $jmeno;
        $this->prijmeni = $prijmeni;
        $this->vek = $vek;
        self::$pocetLidi++;
        $this->id = self::$pocetLidi;
        $this->heslo = $heslo;
    }

    public function spi($doba)
    {
        $this->unava -= $doba * 10;
        if ($this->unava < 0)
            $this->unava = 0;
    }

    public function behej($vzdalenost)
    {
        if ($this->unava + $vzdalenost <= 20)
            $this->unava += $vzdalenost;
        else
            echo('Jsem příliš unavený.');
    }

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

    protected function celeJmeno()
    {
        return $this->jmeno . ' ' . $this->prijmeni;
    }

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

    public static function validniHeslo($heslo)
    {
        return (mb_strlen($heslo) >= 5);
    }

}
class Javista extends Clovek
{
    public $ide;

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

    public function programuj()
    {
        echo("Programuji v {$this->ide}...");
    }

    public function pozdrav()
    {
        echo('Hello world! Jsem ' . $this->jmeno);
    }

}

Validační metodu je možné volat bez instance, což se v naší situaci hodí.

Konstanty

Mezi třídní prvky patří také konstanty. Jak jistě z matematiky známe, jedná se o nějakou neměnnou hodnotu. Konstanty jsou vždy statické, ačkoli se před ně modifikátor static nepíše. Definují se klíčovým slovem const a patří vždy nějaké třídě. Jejich název se píše velkými písmeny, místo mezer se používají podtržítka. Píší se jako první ve třídě, ještě před atributy.

Konstanta Pí

Přidejme si konstantu PI do naší třídy Matematika.php z minula:

class Matematika
{

    const PI = 3.14159265358979;

    public static function naDruhou($zaklad)
    {
        return $zaklad *$zaklad;
    }

}

V index.php si ji zkusme použít:

require_once('tridy/Matematika.php');

$polomer = 5;
$obsah = Matematika::PI * Matematika::naDruhou($polomer);
echo("Obsah kruhu je $obsah cm<sup>2</sup>.");
class Matematika
{

    const PI = 3.14159265358979;

    public static function naDruhou($zaklad)
    {
        return $zaklad *$zaklad;
    }

}

Výsledek:

Your page
localhost

Konstanta minimální délky hesla

Konstanta se nám hned hodí pro minimální délku hesla. Když se ji někdy rozhodneme změnit nebo ji budeme chtít použít na více místech, bude přehledně definována jednou na začátku třídy. Přidejme k naší třídě Clovek.php konstantu DELKA_HESLA nastavenou na hodnotu 5:

const DELKA_HESLA = 5;

Nyní nahradíme pětku v metodě validniHeslo() za tuto konstantu. Jelikož se jedná o třídní prvek, použijeme k přístupu ke konstantě zevnitř třídy klíčové slovo self:

public static function validniHeslo($heslo)
{
    return (mb_strlen($heslo) >= self::DELKA_HESLA);
}

Program funguje jako dříve a důležitá konstanta je přehledně na začátku třídy. Ke konstantě můžeme samozřejmě opět přistupovat i mimo třídu:

echo('Vítejte v registraci, zvolte si uživatelské jméno a heslo o minimální délce ' . Clovek::DELKA_HESLA);

Konstanty bychom měli využívat ve svých aplikací pokaždé, když definujeme nějakou neměnnou hodnotu. Často je využívám pro různé limity, např. maximální počet událostí na člena:

const MAX_UDALOSTI = 50;

Výčtové typy (ENUM) v PHP

Konstanty se v PHP často využívají pro nahrazení tzv. výčtových typů, které PHP neobsahuje. Sice se dají nahradit pomocí tříd, ale používání konstant se uchytilo více, protože je to jednodušší.

Když máme v aplikaci proměnnou, která nabývá vždy jedné hodnoty z určitého výčtu hodnot, použijeme právě konstanty.

Typ zprávy

Ukažme si využití výčtových typů na reálném příkladu. Budeme uchovávat zprávu pro uživatele, kterou vygeneroval náš redakční systém. Zpráva může být buď informační (modrá s ikonkou i), chybová (červená s ikonkou křížku) nebo úspěšná (zelená s fajfkou).

K reprezentaci zprávy můžeme použít obyčejné asociativní pole, kde v klíči bude typ zprávy a v hodnotě její text. Bez znalostí konstant bychom asi použili k uchování typu textový řetězec:

$zprava = array(
    'typ' => 'uspech',
    'text' => 'Článek byl publikován',
);

Takovéto zprávě potom podle typu přiřadíme CSS třídu, můžeme je podle typu řadit a podobně. Abychom nemuseli přemýšlet nad tím, zda jsme zvolili hodnotu "uspech", "uspesna" nebo "ok", uděláme si na hodnoty z výčtu konstanty. Konstanty budou přehledně na třídě, která zprávy zpracovává a IDE nám je bude i napovídat:

class SpravceZprav
{
    const TYP_INFO = 0;
    const TYP_USPECH = 1;
    const TYP_CHYBA = 2;

    public function pridejZpravu($typ, $text)
    {
        . . .
}

Vše je přehlednější. Výše vidíte náznak třídy, jejíž metoda pridejZpravu() vytvoří pole se zprávou a to si uloží. Vnitřní mechanismus jsem zde pro jednoduchost zanedbal. Metoda pridejZpravu() by se volala asi takto:

$spravceZprav = new SpravceZprav();
$spravceZprav->pridejZpravu(SpravceZprav::TYP_USPECH, 'Článek byl publikován');

Podobná třída je opravdu použita v seriálu o tvorbě MVC objektového redakčního systému v PHP k zobrazování zpráv uživateli. Časem se tam jistě dostanete :)

Pozn. : Konstanty se ve starých neobjektových verzích PHP definovaly pomocí funkce define(). Taková konstanta nepatřila žádné třídě a trpěla nedostatky neobjektového programování, které jsme si zmiňovali v začátcích seriálu.

I příští lekci, Statika v PHP do třetice, budeme věnovat statice, ukážeme si využití statického databázového wrapperu, statického registru a pobavíme se více teoreticky o správných a špatných využitích třídních prvků. Soubory z dnešní lekce jsou jako vždy ke stažení v archivu níže.


 

Stáhnout

Staženo 643x (1.91 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
19 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
Statika v PHP
Všechny články v sekci
Objektově orientované programování (OOP) v PHP
Miniatura
Následující článek
Statika v PHP do třetice
Aktivity (10)

 

 

Komentáře

Avatar
Michal Žůrek - misaz:2.9.2013 12:25

Výčtové typy (UNUM) v PHP mělo předpokládám být ENUM.

 
Odpovědět
2.9.2013 12:25
Avatar
Kit
Redaktor
Avatar
Kit:2.9.2013 14:20

Ten příklad se statickou metodou je tak trochu umělý. Ve skutečnosti bychom si vystačili s voláním

$clovek = new Clovek('Jan', 'Novák', 32, $heslo);

Uvnitř konstruktoru by byl test na délku hesla a v případě nesplnění stačí jen

throw new Exception('Heslo musí být dlouhé minimálně 5 znaků');

Tím se nám celá kontrola zapouzdří do třídy a nikdo už instanci $clovek s kratším heslem nevytvoří ani kdyby chtěl.

Odpovědět
2.9.2013 14:20
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.9.2013 15:45

To by určitě také šlo, ale to funguje jen díky tomu, že se jedná o chybový stav. Určitě by se daly vymyslet jiné statické metody, které by se na třídě hodily. Napadá mě třeba obsazenost přezdívky, kterou by si tahal AJAX.

Editováno 2.9.2013 15:46
Odpovědět
2.9.2013 15:45
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ět
2.9.2013 15:47
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.9.2013 15:55

Obsazenost přezdívky je také chybový stav :)

Odpovědět
2.9.2013 15: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:2.9.2013 15:57

Přece nebudeš v AJAXu tvořit instanci uživatele abys zjistil, zda není obsazená přezdívka :P Ale stejně je vykonstruovaná i ta třída, v reálu se to moc na objekty nemapuje. Že jde vše zapsat bez statiky jsem v článku psal. Statika se u webových aplikací používá hodně a lidé se s ní budou setkávat, ať už je to dobře nebo ne. Na něčem se to ukázat musí.

Odpovědět
2.9.2013 15: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 David Čápka
Kit:2.9.2013 16:09

Ta instance se přece nevytvoří, protože výjimka jí to nedovolí. A jak jinak chceš zajistit exkluzivitu přezdívky než tím, že ji v databázi založíš? A když už budeš chtít založit v databázi záznam, tak pro něj potřebuješ data. Nejlépe z objektu. A tomu data předáš konstruktorem.

Pokud v databázi přezdívka existuje, INSERT se neprovede a vyhodí se výjimka. Tím se napůl vytvořený objekt zlikviduje. Vše je hezky zapouzdřeno do jediné třídy. Volající metoda nemusí žádnou duplicitu testovat, protože to není její starost.

Editováno 2.9.2013 16:10
Odpovědět
2.9.2013 16:09
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.9.2013 16:37

Bavíme se o AJAXu, chci tedy zjistit obsazenost přezdívky ještě předtím než uživatel vyplní formulář a zadá tak vše, co je třeba k vytvoření instance.

Odpovědět
2.9.2013 16:37
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.9.2013 16:44

A co když mezitím (po tomto testu, ale před vytvořením instance) někdo tu přezdívku obsadí?

Odpovědět
2.9.2013 16:44
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.9.2013 17:08

Tak to samozřejmě zachytí validátor na serveru.

Editováno 2.9.2013 17:08
Odpovědět
2.9.2013 17: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:2.9.2013 17:13

Jaký validátor? Snad databáze, ne? To je její starost.

Odpovědět
2.9.2013 17:13
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.9.2013 17:30

Tak samozřejmě, měl jsem na mysli, že se to zvaliduje na serveru. Ověření tam musí být 2x, jednou při INSERTU při konečném odeslání a jednou jako SELECT v metodě pro AJAX, jelikož tam ještě není co vkládat, pole nejsou vyplněná.

Odpovědět
2.9.2013 17:30
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
CZechBoY
Člen
Avatar
CZechBoY:22.1.2014 14:21

Ta DELKA_HESLA je spíš minimální délka hesla než maximální ne? :-)

 
Odpovědět
22.1.2014 14:21
Avatar
Juraj Mlich
Redaktor
Avatar
Odpovídá na CZechBoY
Juraj Mlich:22.1.2014 14:25

Nadpis - Konstanta maximální délky hesla

 
Odpovědět
22.1.2014 14:25
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na CZechBoY
Jan Vargovský:22.1.2014 14:26

Však tam je minimální.

 
Odpovědět
22.1.2014 14:26
Avatar
Juraj Mlich
Redaktor
Avatar
Odpovídá na Jan Vargovský
Juraj Mlich:22.1.2014 14:29

Je chyba v podnadpise - Konstanta maximální délky hesla , ale podmienka to testuje ako minimálnu dĺžku ...

 
Odpovědět
22.1.2014 14:29
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na CZechBoY
David Čápka:28.2.2014 12:26

Díky, opraveno.

Odpovědět
28.2.2014 12:26
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
Matúš Petrofčík
Šéfredaktor
Avatar
Matúš Petrofčík:4.4.2014 15:22

Nemala by byť tá premenná

private $heslo;

radšej

protected $heslo;

keďže ju chceme použiť aj v Javistovi?
Z minulých dielov som pochytil, že v potomkoch nemôžeme používať/meniť private premenné rodičovských tried, ale protected áno
ak sa mýlim, poprosím vysvetlenie :) ďakujem

Odpovědět
4.4.2014 15:22
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Matúš Petrofčík
Neaktivní uživatel:5.4.2014 14:23

Jo, protected by radsi byt mela. Ano, protected promenne vidi sama trida a potomci + rodice.

Odpovědět
5.4.2014 14:23
Neaktivní uživatelský účet
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Neaktivní uživatel
Matúš Petrofčík:5.4.2014 14:24

takže sa dá povedať že je v článku chyba? :D

Odpovědět
5.4.2014 14:24
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovědět
5.4.2014 14:25
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Matúš Petrofčík
David Čápka:6.4.2014 14:20

Chyba to není, heslo a přihlašování je nějaká vnitřní logika člověka a potomek k ní nepotřebuje mít přístup, stačí, že ji obsahuje.

Odpovědět
6.4.2014 14:20
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
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na David Čápka
Matúš Petrofčík:6.4.2014 14:24

Pre toto som ti písal správu, lebo len ty vieš najlepšie ako si to pri písaní článku myslel :)
Takto som nad tým nepremýšľal, ďakujem. ;)

Odpovědět
6.4.2014 14:24
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Marek Šafránek:15.1.2015 15:02

Zdravím,

věděl by prosím někdo proč se mi zobrazuje chyba při otevření index.php(pokud udělám přímé require bez autoloaderu, funguje jak má, funguje i nadále, pokud do kodu vrátím na místo přímého require autoloader):

Fatal error: Undefined class constant 'DELKA_HESLA'

___
class Clovek
{

        const DELKA_HESLA = 5;
        public $jmeno;
        public $prijmeni;
        public $vek;
        private $unava = 0;
        public $id;
        private static $pocetLidi = 0;
        private $heslo;
...

___
<?php

        function nactiTridu($trida)
        {
                require("tridy/$trida.php");
        }

        spl_autoload_register("nactiTridu");


        mb_internal_encoding("UTF-8");

        echo('Vítejte v registraci, zvolte si uživatelské jméno a heslo o minimální délce ' . Clovek::DELKA_HESLA);
Odpovědět
15.1.2015 15:02
Stojí-li něco za námahu, je třeba to udělat pořádně...
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Marek Šafránek
Matúš Petrofčík:15.1.2015 15:27

skús niečo ako

<?php

        function nactiTridu($trida)
        {
                require("tridy/$trida.php");
        }

        spl_autoload_register("nactiTridu");


        mb_internal_encoding("UTF-8");

        $delka_hesla = Clovek::DELKA_HESLA; // najprv si tú premennú získať

        echo('Vítejte v registraci, zvolte si uživatelské jméno a heslo o minimální délce ' . $delka_hesla); // až tak ju vypísať
Odpovědět
15.1.2015 15:27
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Martin Franta:30.4.2015 13:34

Měl bych otázku ohledně logiky - v článku se píše, že funkce validniHeslo logicky patří pod třídu Clovek. Pokud bysme se však nebavili o ukázkové app, ale větším projektu, kde máme desítky různých typů validací tak nemělo by větší logiku vytvořit třídu Validator která bude obsahovat všechny možné kontroly/validace a budeme je tak mít pohromadě?
Pokud bych to měl aplikovat na tento příklad tak dejme tomu, že kromě třídy Clovek budeme mít ještě třídu Ufon, která nebude Cloveka rozšiřovat, ale bude naprosto rozdílná. Přitom heslo budeme chtít od obou a budeme vyžadovat stejné podmínky. Potom když budeme pracovat s Ufonem tak mi přijde logičtější volat Validator->heslo($heslo) než do toho motat Cloveka a volat Clovek::valid­niHeslo($heslo)
V OOP si teprve doplňuju mezery protože sem byl několik let zaseknutý na větším projektu, který nebyl napsaný objektově a nebyl čas jej přepisovat. Snažím se proto především zvyknout si na rozdílný způsob myšlení abych nedělal v objektech nesmysly, takže budu rád za jakoukoliv konstruktivní poznámku k situaci co sem uvedl :)

 
Odpovědět
30.4.2015 13:34
Avatar
Odpovídá na Martin Franta
Martin Konečný (pavelco1998):30.4.2015 13:48

Buď si uděláš třídu určenou pro hesla (třeba Passwords), případně by měla jít i ta tvá Validators.
Třetí možnost je, aby třídy Clovek i Ufon dědily od třídy, která by danou metodu obsahovala (třeba Bytost :D).

Odpovědět
30.4.2015 13:48
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Vít Cigánek:12.10.2015 15:54

Na xampu mi tenhle kod funguje na serveru nikoliv. Nema někdo nějaky napad co nastavit v php.ini

$polomer = 5;
$obsah = Matematika::PI * Matematika::naDruhou($polomer);
echo("Obsah kruhu je $obsah cm<sup>2</sup>.");
 
Odpovědět
12.10.2015 15:54
Avatar
Odpovídá na Vít Cigánek
Vít Cigánek:12.10.2015 16:21

vyřešeno, omlouva se za spam... měl jsem před tím

echo $pavla->celeJmeno();

s tim ze celeJmeno je protected. Tak mi to nebralo posledni radky.

 
Odpovědět
12.10.2015 16:21
Avatar
Vít Cigánek:9.11.2015 17:15

Nechápu proč mi funguje Javista když heslo ma status

$private

Jedině snad proto, že je v konstruktoru.

 
Odpovědět
9.11.2015 17:15
Avatar
Odpovídá na Vít Cigánek
Martin Konečný (pavelco1998):9.11.2015 17:20

Co by podle tebe nemělo fungovat?

Odpovědět
9.11.2015 17:20
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Vít Cigánek:9.11.2015 17:24

Vytvoření instance, protože to mám v konstruktoru. Je možné že nerozumím použití private, protected a public.. nebo spíše public mi je jasný, ale po tomhle mám pochybnosti jestli rozumím atributum private a protected.

 
Odpovědět
9.11.2015 17:24
Avatar
Odpovídá na Vít Cigánek
Martin Konečný (pavelco1998):9.11.2015 17:46

Když je atribut public, můžeš ho přímo použít odkudkoliv (ze třídy, z potomka nebo zvenku), protected jen ze třídy a z potomka a private jen ze třídy.

class Neco
{

        public $a;
        protected $b;
        private $c;


        public function akce()
        {
                echo $n->a;  // OK
                echo $n->b;  // OK
                echo $n->c;  // OK
        }

}

$n = new Neco();
echo $n->a;  // OK
echo $n->b;  // error
echo $n->c;  // error


class Potomek extends Neco
{

        public function akce()
        {
                echo $n->a;  // OK
                echo $n->b;  // OK
                echo $n->c;  // error
        }

}
Odpovědět
9.11.2015 17:46
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
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 33 zpráv z 33.