Diskuze: Volání fce s proměnlivým rozhraním
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 7 zpráv z 7.
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.


Ahoj a co třeba to rozdělit do dvou metod:
public function ziskejClanekById($id)
public function ziskejClanekByName($name)
function ziskejClanek($nazevSloupce, $hodnota){
// SQL query
}
$clanek1 = ziskejClanek('nazev', 'nazev clanku');
$clanek2 = ziskejClanek('id', 456);
nebo
function ziskejClanek($id = NULL, $nazev = NULL){
if($id !== NULL){
// SQL query2
}else{
// SQL query1
}
}
$clanek1 = ziskejClanek(NULL, 'nazev clanku');
$clanek2 = ziskejClanek(456, NULL);
Ale tohle není dobrý nápad. Spíš bych se přiklonil té první a nebo využít možnost co je napsaná výše.
Treba takhle?
public function ziskejClanek($arg) {
if (isset($arg['id'] AND is_int($arg['id']) {
sql query
}
if (isset($arg['nazev'] AND !empty($arg['nazev'])){
sql query
}
}
// zavolani funkce v jednom pripade
ziskejClanek(array('id'=>'123');
// zavolani funkce v jinem miste aplikace
ziskejClanek(array('nazev' => 'abc');
Musím říct, že některé ty konstrukce jsou fakt brutální
.
Ahoj, osobně bych to spíše rozdělil na dvě odlišné funkce, protože jedna funkce by měla dělat jednu konkrétní věc, čili třeba "hledat podle ID" nebo "hledat podle názvu".
Když bych dělal nějakou obecnou metodu, kde můžu hledat podle více libovolných parametrů, pak to budu řešit postupným skládáním dotazu dle parametrů, velmi zjednodušeně např.:
function ziskejClanek(array $parametry)
{
$sql = "SELECT * FROM clanek WHERE";
if (isset($parametry["nazev"])) {
$sql .= " nazev = ''{$parametry[nazev]}";
}
if (isset($parametry["datum"])) {
$sql .= "AND datum = '{$parametry[datum]}'"
}
// zavolání dotazu do DB
}
$clanek = ziskejClanek(array(
"nazev" => "Test",
"datum" => "2018-01-25"
));
Pokud ovšem hledám článek dle jednoho konkrétního parametru, pak bych definoval dvě různé metody, tedy
function ziskejClanekDleId($id)
{
// vyhledání pomocí ID
}
function ziskejClanekDleNazvu($nazev)
{
// vyhledání pomocí názvu
}
$clanek = ziskejClanekDleId(123);
$clanek2 = ziskejClanekDleNazvu("Test");
Důvod je prostý - čitelnost. Pokud budu mít jednu funkci, která bude dělat dvě odlišné věci dle toho, jestli vyplním první nebo druhý parametr, jednak v tom bude zmatek, zvýší se chybovost a když budu chtít hledat článek třeba ještě podle data, tak přidám třetí parametr? A když i podle autora, přidám čtvrtý parametr? Tohle se mi zdá jako špatný způsob, protože tím akorát zvyšuješ tu "zmatečnost".
Pokud budu chtít přidat hledání článku nově i konkrétně dle data, stačí mi pro to udělat novou funkci.
function ziskejClanekDleData($datum)
{
// vyhledání pomocí data
}
$clanek = ziskejClanekDleData("2018-01-25");
Pokud by takových funkcí začalo být moc a kód by se začal v podstatě opakovat, jen by se vždy změnila jedna malá část (v tomto případě by bylo vše stejné kromě jednoho WHERE v SQL dotazu), tak by stálo za to, pouvažovat, zda by to nešlo nějak zjednodušit, aby se kód neopakoval (tzv. pravidlo DRY - https://cs.wikipedia.org/…eat_yourself), třeba pomocí výše zmíněné "obecné" metody, která přijímá pole parametrů.
Zobrazeno 7 zpráv z 7.