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í.

Diskuze – Lekce 9 - Statika v PHP

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
jip123
Člen
Avatar
jip123:3.9.2014 17:58

Seriál je celkem dobrý, ale narazil jsem v kódu na spl_autoload_re­gister("nacti­Tridu");, nebylo vysvětleno,nechápu jak to funguje.

 
Odpovědět
3.9.2014 17:58
Avatar
Odpovídá na jip123
Neaktivní uživatel:3.9.2014 18:01

Tahle funkce zaregistruje třídu, kterou jí předáš v parametru jako autoloader. Autoloader se zavolá, pokud budeš zakládat objekt, jehož třída není ještě načtená. Většinou se podle názvu třídy načte soubor, který ji obsahuje.

Odpovědět
3.9.2014 18:01
Neaktivní uživatelský účet
Avatar
Danny
Člen
Avatar
Danny:19.7.2015 22:19

Ahoj, prosím někoho, jestli by mi řekl zda to chápu vše dobře.
Zkusil jsem si metodu "validniHeslo()" upravit tak aby ta logika byla v ní a ne v indexu a mám to tedy takto. Funguje to, ale spíš by mě zajímalo jestli to chápu správně. Je to statická metoda, tím pádem bez instance a přímo se odkazuju na třídu v které ta metoda je, tady "Clovek"? Potom to teda mám ve třídě Clovek takto:

const DELKA_HESLA = 5;


public static function validniHeslo($heslo)
    {
        if (mb_strlen($heslo) >= self::DELKA_HESLA)
        $hlaska = "Heslo je v pořádku";
        else $hlaska="Heslo musí být dlouhé minimálně 5 znaků";
        return $hlaska;

    }

a v indexu takto:

echo Clovek::validniHeslo($heslo);

Tak by mě jenom zajímalo jestli to tak je správně a správně to chápu.Předem díky za odpověď :)

 
Odpovědět
19.7.2015 22:19
Avatar
Odpovídá na Danny
Martin Konečný (pavelco1998):20.7.2015 1:03

Obvykle je lepší, aby metody nevracely přímo určitý text, ale jen stav. Tím je myšlena např. informace o chybě (číslo/klíč chyby), bool hodnota TRUE/FALSE apod.
Ve tvém případě něco jako

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

    return FALSE;
}

Chceš provést víc validací naráz a zjistit, kde to škončilo chybou?

class User
{

    const PASS_LENGTH = 5;

    // atributy a metody

}

class PasswordValidator
{

    const ERR_PASSWORD_SHORT = 1,
        ERR_NO_UPPERCASE_LETTERS = 2,
        ERR_NO_NUMBERS = 3;

    const PASS_OK = 0;

    public static function checkPassword($p)
    {
        if (mb_strlen($p) < User::PASS_LENGTH) {
          return self::ERR_PASSWORD_SHORT;
        }
        if (!preg_match("kontrola velkých písmen", $p)) {
          return self::ERR_NO_UPPERCASE_LETTERS;
        }
        if (!preg_match("kontrola čísel", $p)) {
          return self::ERR_NO_NUMBERS;
        }

        return self::PASS_OK;
    }

}


$p = $_POST["password"];
$result = PasswordValidator::checkPassword($p);
if ($result !== PasswordValidator::PASS_OK) {
    switch ($result) {
        case PasswordValidator::ERR_PASSWORD_SHORT:
            $msg = "heslo je příliš krátké";

        case PasswordValidator::ERR_NO_UPPERCASE_LETTERS:
            $msg = "heslo musí obsahovat velká písmena";

        case PasswordValidator::ERR_NO_NUMBERS:
            $msg = "heslo musí obsahovat čísla";
    }

    echo "V ověření hesla se vyskytla chyba: {$msg}";
}

To je ale ošklivý, co? Co tohle?

class PasswordValidator
{

    public static function checkPassword($p)
    {
        if (mb_strlen($p) < User::PASS_LENGTH) {
          throw new Exception("heslo je příliš krátké");
        }
        if (!preg_match("kontrola velkých písmen", $p)) {
          throw new Exception("heslo musí obsahovat velká písmena");
        }
        if (!preg_match("kontrola čísel", $p)) {
          throw new Exception("heslo musí obsahovat čísla");
        }
    }

}


$p = $_POST["password"];

try {
   PasswordValidator::checkPassword($p);

   // další akce
} catch (Exception $e) {
    echo "Někde se stala chyba: {$e->getMessage()}";
}

Zde by opět pro určité případy nebylo vhodné, aby výjimka obsahovala přímo text. Může obsahovat klíč (podle kterého se text přeloží), kód chyby, případně i vyhazovat jiný druh výjimky dle druhu chyby (to mi ale přijde trochu overkill).

Odpovědět
20.7.2015 1:03
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Danny
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Danny:20.7.2015 1:22

WAU...tak takhle daleko ještě nejsem :) jsem u počítadla přístupů, ale asi tomu rozumím :)
takže se pak volají vlastně konstanty, které přiřadím k nějaký validaci., paráda.

Každopádně díky moc a hned jak nastuduju asi vyjímky jestli chápu, tak se k tomu vrátím.
Spíš jsem se chtěl ujistit jestli chápu princip :) díky

 
Odpovědět
20.7.2015 1:22
Avatar
Vít Cigánek:12.10.2015 14:38

Já nevím proč, ale musím mít nastavené

private static $pocetLidi=-1;

jinak mi to čísluje od dvojky.

 
Odpovědět
12.10.2015 14:38
Avatar
Jan Zamecnik
Člen
Avatar
Odpovídá na Vít Cigánek
Jan Zamecnik:16.9.2016 15:56

Trochu pozdě na odpověď, ale bude to možná tím, že postupně přidáváš kód během učení, tak jak to dělám já a nad definováním pole

$lide = array();

jsi již vytvořil jednu instanci Člověka nebo Javisty. Mě to takhle počítalo od 3 a zjistil jsem, že jsem již dříve vytvořil jednoho Člověka a jednoho Javistu. Ti se počítají taky, i když nejsou součásti pole.

 
Odpovědět
16.9.2016 15:56
Avatar
Petr Kateřiňák:15.3.2019 21:06

Ahoj, zeptal bych se v tomto pripade na MVC modely. Je v poradku, tvorit je staticky, kdyz "pouze" vytvareji dotazy na staticky databazovy wrapper, pripadne maji semtam nejakou tu spolecnou vypocetni funkci? Jde mi o to, ze je zde doporuceno statiku vubec nepouzivat, ale zrovna tady mi přijde zbytecne delat v jednom kontroleru X instanci ruznych modelu. Jak je to treba s vykonem? Je lepsi vytvorit instanci a z ni pouzit treba dve metody z 20 pritomnych nebo je staticky zavolat? Predpokladam, ze se vzdy nacte cela trida a v pripade require_once v autoloaderu to asi vykonnostni vliv nema.

 
Odpovědět
15.3.2019 21:06
Avatar
dvorakj3
Člen
Avatar
dvorakj3:16.3.2023 14:38

Pokud si stáhnu oop_statika.zip, tak je v něm chyba. Konstruktor třídy Javista má parametry

public function __construct(string $jmeno, string $prijmeni, string $vek, public int $ide)

Má tam být

public function __construct(string $jmeno, string $prijmeni, int $vek, public string $ide)
 
Odpovědět
16.3.2023 14:38
Avatar
Radim Štross
Tvůrce
Avatar
Odpovídá na dvorakj3
Radim Štross:6.10.2023 9:38

Ahoj, díky za upozornění. Archiv se vzorovým kódem na konci lekce už byl opraven.

 
Odpovědět
6.10.2023 9:38
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 10 zpráv z 20.