Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – 9. diel - Statika 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
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.

 
Odpovedať
3.9.2014 17:58
Avatar
Odpovedá 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.

Odpovedať
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ěď :)

 
Odpovedať
19.7.2015 22:19
Avatar
Odpovedá 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).

Odpovedať
+3
20.7.2015 1:03
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Danny
Člen
Avatar
Odpovedá 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

 
Odpovedať
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.

 
Odpovedať
12.10.2015 14:38
Avatar
Jan Zamecnik
Člen
Avatar
Odpovedá 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.

 
Odpovedať
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.

 
Odpovedať
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)
 
Odpovedať
16.3.2023 14:38
Avatar
Radim Štross
Tvůrce
Avatar
Odpovedá 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.

 
Odpovedať
6.10.2023 9:38
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 21.