Diskuze: Faktura - OOP
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 2 zpráv z 2.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


OOP není těžký, to ti jen přijde, než si to řádně ohmatáš
Pokud to vezmu kolem a kolem,
nemáš to špatně, určitě jsou způsoby, jak to dál a dál vylepšit,
prvním z nich je třeba to, že určitě bych nepoužil takovou obrovskou
definici několika tříd v jednom souboru. Pokud neznáš, tak doporučuju
googlit po PHP Autoloaderu, kde se potom držíš zásady 1 třída = 1 soubor.
Autloader si pak soubory projde, nacachuje si kde je jaká třída a pak podle
toho, kdy jsou v program využity je teprva volá (lazy loading).
První, co mě trochu zarazilo je toto:
public function __construct() {
$this->mena = "CZK";
$this->zaokrouhleni = true;
$this->zaokrouhleni_typ = 1;
$this->zaokrouhleni_zpusob = 1;
$this->jmeno_souboru = "faktura";
$this->dph_sazby = (object) Array("0" => "Nulová sazba", "15" => "Snížená sazba", "21" => "Základní daň");
$this->dph_shrnuti = false;
$this->dph_platce = false;
}
já osobně bych constructor nenechal setovat defaulty. Tak jak to máš teď, to nemá ani žádný význam, ten kdo bude vytvářet třídu Nastaveni (kde se mu tento construct spustí) stejně nemůže žádným parametrem ovlivnit, co se v constructu stane. Trochu smysl by to dávalo, kdyby jsi plánoval to pozměnit takto:
public function __construct(string $mena = "CZK") {
$this->mena = $mena;
...
}
tedy případ, kdy si v místě vytváření instance třídy Nastaveni můžeme ovlivnit její nastavení. Jinak bych použil jednoduše toto:
final class Nastaveni {
// Nastaveni
/** @var boolean $zaokrouhleni */
private $zaokrouhleni = true;
/** @var integer $zaokhrouhleni_typ */
private $zaokrouhleni_typ = 1;
/** @var integer $zaokrouhleni_zpusob */
private $zaokrouhleni_zpusob = 1;
/** @var string $mena */
private $mena = "CZK";
/** @var string $jmeno_souboru */
private $jmeno_souboru = "faktura";
...
A je to. Víš proč je třeba tohle lepší, než tvoje aktuální / případné? Jednoduše, zkusim to ukázat na příkladu:
Teď máš pouze obyčejné settery, které prostě vezmou parametr a narvou ho do vlastnosti. To je sice fajn ale velmi brzo zjistíš, že by bylo fajn rovnou setter použít kupříkladu k validaci. Trochu hloupě ale pro účel tedy jednoduše ho upravím takto:
public function setZaokhrouhleni($zaokrouhleni) {
if(is_bool($zaokrouhleni){
$this->zaokrouhleni = $zaokrouhleni;
return $this;
}
throw new Exception('Parametr musi byt datoveho typu boolean!');
}
(nebudu teď řešit, že tohle si automaticky může ošefovat PHP tím, že bych napsal public function setZaokhrouhleni(boolean $zaokrouhleni).. prostě jen nějaká validace na ukázku)
Teď když máš tedy v setteru nějakou validaci nebo zpracování vstupních dat do vlastnosti, tak dá přeci rozum, že jediný správný způsob, jak zapisovat do vlastnosti je přes setter a v žádném případě jinak. Tedy ani přes konstruktor, protože by ti pak mohlo nastat to, že když necháš uživatele nastavovat skrze konsturktor, tak si můžeš maximálně tak ohlídat datový typ, nikoliv však už třeba správnou délku nebo provést potřebné "zparsování". Mohl bys namítat, že přeci můžeš udělat potom tedy toto:
public function __construct(boolean $zaokrouhleni) {
$this->setZaokrouhleni($zaokrouhleni);
...
}
ale představ si ten "šok" pro někoho, kdo k tomu kódu přijde jako
další, nebo sám sebe za dva roky
Ty si instancuješ Fakturu, ta si instancuje nastavení... protože
Faktura je obslužná pro Nastavení, tak budu sema pro její konstruktor
vyžadovat nějaké proměnné. Ty jí je tedy při vytváření předáš a
hle... když si hned potom zavoláš getterem obsah vlastnosti, kterou si o
řádek vejš nastavil, tak je tam něco úplně jinýho, protože constructor s
tím něco provedl! Následuje lození hlouběji a hlouběji do kódu a
zjišťování, co se vlastně stalo... Pokud však použiješ způsob, co jsem
popsal jako nejlepší, bude instancování probíhat takto:
$test = new Faktura;
$test->Nastaveni->setZaokrouhleni(false); //Při instancování se samo defaultně nastavilo true
P.S: Nevím, jak moc se vyznáš ale pro případ, že jsi si všiml anotací jako /** @var string $mena */ a nevíš o co jde: Doporučuju si něco málo opět nastudovat a začít to používat (php annotations) i pro metody a třídy... pokud tě PHP baví a hodláš v tom jít dál a dál, tak je to jenom další zvyk, co ti do budoucna ušetří práci s tvými dalšími projekty a učením se dalších nových věcí.
Zobrazeno 2 zpráv z 2.