Zadejte hledaný výraz...
Jakub Glos
Webtrh.cz
Vývoj webových stránek na WordPressu a proklientský přístup pro freelancery
Třídenní infromacemi nabitý prezenční + online kurz v Praze od Webtrhu pouze za 2 871 Kč
Více informací

Funkce s více argumenty předávanými byref

crs
verified
rating uzivatele
(1 hodnocení)
12. 7. 2018 23:29:47
Zdravím.
Napadlo mě napsat si "makro"/funkci, která mi zkrátí zápis, např.
if (isset($_GET) || isset($_GET) || isset($_GET) || isset($_SESSION) || isset($_GET)) {
...
}
na
if (anyset($_GET, $_GET, $_GET, $_SESSION, $_GET)) {
...
}
Pro jeden argument by hlavička této funkce byla
function anyset(&$variable) {
return isset($variable);
}
Já bych ji chtěl rozšířit na libovolný počet parametrů.
Zkoušel jsem:
* func_get_args() - hodí Notice: Undefined index
* func_get_arg() - použít s isset() nejde
* anyset(...$variables) - hodí Notice: Undefined index
* anyset(...&$varibles) - není povoleno
Zná někdo řešení?
Díky
12. 7. 2018 23:29:47
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356217
David Musil
verified
rating uzivatele
(68 hodnocení)
12. 7. 2018 23:31:38
Dej to tam jako pole na vstupu.
12. 7. 2018 23:31:38
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356216
node
verified
rating uzivatele
(5 hodnocení)
13. 7. 2018 01:39:54
array_intersect_key($_GET, array_fill_keys(, null))
13. 7. 2018 01:39:54
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356215
crs
verified
rating uzivatele
(1 hodnocení)
13. 7. 2018 11:14:38
Napsal musil.david;1474161
Dej to tam jako pole na vstupu.
Sorry - vůbec nerozumím. Co znamená "to" a "tam"?
Pokud jsi si jistý, že tvá rada funguje, šlo by odpovědět přímo příkladem kódu?
Napsal node;1474164
array_intersect_key($_GET, array_fill_keys(, null))
Tvůj kód:
* dělá úplně něco jiného, než potřebuju (nepotřebuju vyplňovat nedefinované proměnné, ale testovat jejich existenci)
* pro nedefinované proměnné stejně hodí "Notice: undefined index"
* nefunguje pro můj zadaný příklad, kde používám více polí
----
Nechci být hrubý a cením si, že mi odpovídáte, ale příště prosím jen odpovědi, které mají větší než nulovou informační hodnotu a nemrhají časem. Díky
13. 7. 2018 11:14:38
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356214
David Musil
verified
rating uzivatele
(68 hodnocení)
13. 7. 2018 11:50:32
Casem si mrhas ty sam, protoze vymyslis znovu kolo :) Ale chapu, asi zacinas, tak to chces polopate...
Mas promennou $_GET, ve ktere muze byt treba deset klicu. Tebe zajimaji pro danou operaci treba jen tri z nich a tak je chces otestovat svou funkci.
Samozrejme se da doplnit spousta osetreni, jako treba filter_input(), ale vzhledem k tomu, ze nepouzivas framework a jen nejake vlastni easy custom reseni, tak to asi uplne nepotrebujes.
13. 7. 2018 11:50:32
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356213
Jiří Mrázek
verified
rating uzivatele
(1 hodnocení)
13. 7. 2018 13:37:12
Jelikož crs nechce pouze $_GET, nebylo by použitelnější něco takového?
Vypadá to, že hledá něco, co mu zobrazí, jestli alespoň 1 z arg existuje, tzn. pokud najdu první existující, vrátím true, jinak pokračuju a pokud nenajdu, vrátím false.. Může být použito jak na ten $_GET, $_SESSION, tak cokoliv..
Možné použití (bez zobrazování errorů) by bylo např.
13. 7. 2018 13:37:12
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356212
crs
verified
rating uzivatele
(1 hodnocení)
13. 7. 2018 21:18:50
Napsal musil.david;1474232
Casem si mrhas ty sam, protoze vymyslis znovu kolo :) Ale chapu, asi zacinas, tak to chces polopate...
Zdravím, Davide. Jak jsem již psal v příkladu a jak napsal Jiří Mrázek, chci tu funkci testovat i na jiné proměnné než z pole $_GET (a nemusejí to být nutně indexy pole). Je to v mém příkladu v mém prvním příspěvku jasně napsané; netušil jsem, že to někdo tak snadno přehlédne. Proto všechno, co jsi zde zatím napsal, je nepoužitelné a není to k tématu. A proto si troufám tvrdit, že mrháš mým časem.
Napsal Jiří Mrázek;1474261
…nebylo by použitelnější něco takového?
Taky díky za odpověď, ale jak jsem psal, func_get_args() jsem zkoušel a hází Notice: Undefined index.
Ohledně @ na potlačení chyby, ok, to jsem nezmínil tak zmiňuju teď – chci řešení bez @.
----
Zná tedy někdo řešení? Existuje vůbec?
13. 7. 2018 21:18:50
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356211
Jiří Mrázek
verified
rating uzivatele
(1 hodnocení)
13. 7. 2018 21:44:32
Dle mého lepší řešení asi nebude, jelikož nemůžeš předat něco, co neexistuje... A když předáš, tak to bohužel vypíše ten error... Jedině vypnout errory a použít verzi bez @...
13. 7. 2018 21:44:32
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356210
rkor
verified
rating uzivatele
13. 7. 2018 23:02:48
13. 7. 2018 23:02:48
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356209
David Musil
verified
rating uzivatele
(68 hodnocení)
14. 7. 2018 02:34:06
Tve ego musi byt opravdu nekde u oblak. Vzdy me pobavi tento pristup ;-) A jeste ty reci, jak plytvam tvym casem.
Ve svem prikladu mas jen glob promenne jako GET a SESSION, tak nerikej, ze jsi napsal neco jasne. Navic je tak jednoduche to predelat. Udelal jsem ti muster, klidne si to rozsir jeste treba o POST a normalni promenne, vzdyt je to jednoduche. Nehazi to zadne errory, funguje to presne jak chces.
$keysGET = array('kategorie', 'produkt', 'stranka');
$keysPOST = array('jmeno', 'vek');
$otherVars = array($var1, $var2);
if (anyset($keysGET, $keysPOST, $otherVars) === TRUE)) {
//tvuj dalsi kod
}
function anyset($keysGET, $keysPOST, $otherVars) {
foreach ($keysGET as $key) {
if (isset($_GET) === FALSE) {
return FALSE;
}
}
foreach ($keysPOST as $key) {
if (isset($_POST) === FALSE) {
return FALSE;
}
}
foreach ($otherVars as $var) {
if (isset($var) === FALSE) {
return FALSE;
}
}
return TRUE;
}
To by me zajimalo, cim mi umyjes prdel tentokrat a co zase budes kritizovat. Mozna tim, ze tam nemam SESSION? :)) Vahal jsem, zda ti jen tam pridelat, ale ber to jako bojovku a domaci ukol ;-)
Tohle reseni vyse mas pro pripad &&. Ve svem prikladu mas ||, takze staci predelat logicka vyhodnoceni opacne, napr.
foreach ($keysPOST as $key) {
if (isset($_POST) === TRUE) {
return TRUE;
}
}
apod.
Dovedu si predstavit realne pouziti takove funkce s &&. Ale s || opravdu moc ne.
14. 7. 2018 02:34:06
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356208
David Musil
verified
rating uzivatele
(68 hodnocení)
14. 7. 2018 09:19:49
Napsal rkor;1474347
Moc pekne :)! Ale neni tohle mozne az od nejake verze phpka?
14. 7. 2018 09:19:49
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356207
rkor
verified
rating uzivatele
14. 7. 2018 09:35:44
Napsal musil.david;1474360
Moc pekne :)! Ale neni tohle mozne az od nejake verze phpka?
5.6+
14. 7. 2018 09:35:44
https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356206
crs
verified
rating uzivatele
(1 hodnocení)
23. 7. 2018 18:53:51
Zdravím všechny! (odpovídám trochu s odstupem, protože tohle vlákno bylo na pár dní omylem zamknuté)
Napsal rkor;1474347
Aha - tak stačilo vyměnit & a ... v mém posledním pokusu-omylu.
Já mezitím vymyslel řešení, které používá s proměnnou proměnné ($$a), ale to vyžadovalo ručně definovat větší (a omezené) množství parametrů v hlavičce funkce. Sice fungovalo, ale kvůli tomu omezení je tvé řešení lepší.
Díky moc!
Napsal Jiří Mrázek;1474340
Dle mého lepší řešení asi nebude, jelikož nemůžeš předat něco, co neexistuje... A když předáš, tak to bohužel vypíše ten error... Jedině vypnout errory a použít verzi bez @...
Jak se ukázalo, tak se řešení našlo.
Napsal musil.david;1474356
Tve ego musi byt opravdu nekde u oblak. Vzdy me pobavi tento pristup ;-) A jeste ty reci, jak plytvam tvym casem.
Ve svem prikladu mas jen glob promenne jako GET a SESSION, tak nerikej, ze jsi napsal neco jasne. Navic je tak jednoduche to predelat. Udelal jsem ti muster, klidne si to rozsir jeste treba o POST a normalni promenne, vzdyt je to jednoduche. Nehazi to zadne errory, funguje to presne jak chces.
To by me zajimalo, cim mi umyjes prdel tentokrat a co zase budes kritizovat. Mozna tim, ze tam nemam SESSION? :)) Vahal jsem, zda ti jen tam pridelat, ale ber to jako bojovku a domaci ukol ;-)
Tohle reseni vyse mas pro pripad &&. Ve svem prikladu mas ||, takze staci predelat logicka vyhodnoceni opacne, napr.
apod.
Dovedu si predstavit realne pouziti takove funkce s &&. Ale s || opravdu moc ne.
Milý, Davide,
Je pěkné, že "tě vždycky baví" můj přístup; mě - abych se přiznal - už moc nebaví třikrát se zeptat a třikrát dostat nepoužitelnou odpověď.
Mé "řeči, jak plýtvám tvým časem" jsou, bohužel, opodstatněné a to z důvodů, které proberu níže.
Napsal musil.david;1474356
Ve svem prikladu mas jen glob promenne jako GET a SESSION, tak nerikej, ze jsi napsal neco jasne.
To, že chci funkci s více proměnnými (které nejsou pouze indexy polí a jsou předávané 'byref'), je uvedeno
  • v mém prvním příspěvku v posledním kódu, kde přesně píšu tvar/hlavičku mé funkce a že ji chci z tohoto tvaru rozšířit na více proměnných (parametrů byref)
  • v mém prvním příspěvku v seznamu pokusů, které jsem zkoušel, v 3. a 4. odrážce
  • v mém příspěvku z 13.07.2018 11:14, kde píšu "nepotřebuju vyplňovat nedefinované proměnné, ale testovat jejich existenci" (kde mluvím o obecných proměnných, ne indexech pole)
  • v příspěvku od Jiřího Mrázka z 13.07.2018 13:37, který říká, že nechci řešit pouze $_GET
  • v mém příspěvku z 13.07.2018 21:18, kde píšu doslova: "chci tu funkci testovat i na jiné proměnné než z pole $_GET (a nemusejí to být nutně indexy pole)." Když nic jiného, tak tady to píšu explicitně.
  • v názvu celého tohoto threadu, který mimochodem můžeš vidět v nadpisu a v drobečkové navigaci
  • v URL stránky, na kterou se právě díváš
    Nikde ode mě není asi slovo o tom, že potřebuju řešit výhradně indexy pole a všude, kde píšu zmiňuju parametry mé funkce, mluvím o parametrech předávaných byref (což jsou obecně jakékoli proměnné).
    Teď ke tvému kódu. Má první námitka je ta, že tvá funkce nemá tvar, o kterém jsem opakovaně, na několika místech a v rozmezí několika dnů psal, jak ho potřebuju.
    Viz výše místa, kde to bylo mnou nebo jinými zmíněno.
    Obecně vzato - když někdo požádá o řešení a napíše formu, jak by to mělo vypadat, tak věz, že je pro něj opravdu nepoužitelné, když si vymyslíš něco jiného a to mu pak tlačíš a zdůrazňuješ, že je to přesně, co potřebuje.
    Napsal musil.david;1474356
    Udelal jsem ti muster, klidne si to rozsir jeste treba o POST a normalni promenne, vzdyt je to jednoduche.
    Zkusil sis tvůj kód spustit? Já to udělal a zde je pár mých postřehů:
  • Úplně první, co dostanu, je parsovací fatal error.
    Nevím, jestli to uznáš, ale třeba se mnou budeš chtě nechtě souhlasit, že toto je vyloženě trapné, téměř v jakémkoli kontextu.
  • ve "foreach ($keysGET as $key)" se nedoporučuje nazývat prvek pole $key, protože název $key se v kontextu foreach používá pro klíč (index).
  • místo "if (isset($_GET) === FALSE) {" je doporučeno (z hlediska lepší čitelnosti, kratšímu zápisu, i konvence) "if (!isset($_GET)) {"
  • Část "return FALSE;" uvnitř funkce je sémanticky chybně.
    Potřebuju vrátit true, pokud existuje alespoň jedna ze všech uvedených proměnných, jinak false (píšu to v prvním kódu mého prvního příspěvku).
    Tvá verze funkce mi vrátí false i v případech, kdy jí předám první proměnné neexistující a za nima existující.
  • koncové "return TRUE;" je sémanticky chybné (ze stejných důvodů jako uvedeno o bod výše).
  • Ano, body 4 a 5, jsou pro logickou konjunkci a tvůj kód pod tím (též se zbytečným "=== TRUE") je pro disjunkci. Má námitka se zde vztahuje ke zbytečnosti, neodpovídání na to, co se tazatel ptal (už jsme minimálně jednou probírali); a nekonzistenci mezi obsahem funkce a jejím názvem. Tj. pokud ji implementuješ takhle, nedává smysl ji nazvat anyset(). Opět zde děláš něco jiného, než oč tě žadatel prosí, a výsledkem toho nebude nic jiného než chyby a zmatek.
  • "{" za hlavičkou funkce by podle konvencí PSR-1 mělo být odřádkované viz (drobnost)
  • obdobně, TRUE a FALSE neodpovídají konvenci PSR-2 a je doporučeno je psát malými písmeny viz (drobnost)
  • Když přehlédnu, že funkce je v pro mě nevhodném tvaru, tak tvá věta o "jednoduchém" rozšíření na $_SESSION je fakticky chybná v tom, že v takovém případě je nutno zkontrolovat existenci pole.
  • Napsal musil.david;1474356
    Udelal jsem ti muster, klidne si to rozsir jeste treba o POST a normalni promenne, vzdyt je to jednoduche.
    Tato tvá věta je v přímém kontrastu s tvým kódem, protože ten toto rozšíření již má. Toto je chyba na tvé straně, ten typ, co způsobuje pozdější zmatky, zbytečné kolečko otázek atd.
    Ok - něco z výše uvedeného není tak významné; důležité je, zda-li je tvůj kód (po nutném odladění) funkční. Pojďme se na to podívat. Na výstup dostanu toto:
    Píšeš, jak je to jednoduché. A tvůj příklad byl zcela ve tvé režii, v tebou kontrolovaném prostředí. Přesto hodí chybovou hlášku.
    Napsal musil.david;1474356
    Nehazi to zadne errory, funguje to presne jak chces.
    V této tvé větě je tedy chybná jak první, tak druhá část věty. Doufám, že jsem zde vysvětlil v detailu proč.
    A ještě - aby toho nebylo málo - celý tvůj nepotřebný a fakticky chybný příspěvek s nepotřebným a syntakticky chybným kódem jsi napsal poté, co už tu někdo napsal správné řešení.
    Očekával jsem po mé první, nebo alespoň druhé odpovědi na to, že je tvůj příklad špatně a proč konkrétně tomu tak je, alespoň něco jako "sorry - má chyba"; místo toho ses pokusil shodit diskuzi na to, že já jsem ten namyšlenej, který znovu vymýšlí kolo (to jsi mimochodem nevysvětlil) a že jsem asi ten začátečník, kterému to musíš vysvětlil polopaticky (což implikuje, je jsem já ten přihlouplý a ty onen odborník, který se musí snížit na to, aby mě to polopatě podal). Dostaly se mi různé narážky, osobních útoky, gaslighting a pokud ne přímo lži tak spousta nepravdivých tvrzení.
    Zkus si, prosím, na chvíli představit, tuto výměnu názorů bez kontextu tebe, mě a daného předmětu: jeden popíše svůj problém, dodá k němu tvar, ve kterém by výsledek chtěl dostat, a seznam řešení, které vyzkoušel a nezafungovaly mu. Druhý mu v první odpovědi odepíše nekvalitní, nepoužitelnou odpověď na 7 slov, z něhož dvě jsou nic neříkající "to" a "tam", bez příkladu a na základě špatně pochopeného zadání. První ho poprosí o příklad. Druhý odpoví narážkami a chybným příkladem na základě špatně pochopeného zadání. První mu vysvětlí, proč je jeho příklad chybný. Druhý odpoví narážkami až téměř nadávkami, opět chybným příkladem, o kterém - jak zdůrazňuje - je přesně, jak prvý a chce a nehází žádné chyby, přičemž - jak se ukáže - nejen, neplatí ani první ani druhá polovina tohoto tvrzení. Ty jsi, Davide, v tomhle případě ten druhý. Jaký je to pocit?
    A zkus si představit, že se to, co's tu předvedl, dá vztáhnout na tebe. Není až tak těžké si představit, resp. nepřekvapovalo by mě, pokud bys slovně napadal klienty (za jejich zády), muselo by se ti mnohonásobně vysvětlovat, že v něčem děláš chybu a v čem a proč konkrétně, pálil bys hodiny až dny času svého klienta/zaměstnavatele tím, že sis špatně přečetl zadání a na jeho základě si vypracoval špatné řešení a poté zákazníka neoprávněně gaslightoval a přesvědčoval o tom, jak on nemá pravdu a ty ano.
    A co se týče "umývání prdele" (tvůj výraz) - já to nepraktikuju - mám lepší věci na práci. Ale v tomhle případě, myslím, že ses ukázal nejvíc ty v tom pravém světle. Nic jsi nevyřešil, všechny tvé odpovědi byly založeny na chybném pochopení mého jasně napsaného zadání a když jsem tě na to upozornil, svedl jsi to na to, že já jsem ten špatný (nezkušený, namyšlený, začátečník, …) a chybu jsi neuznal. Ať chceš nebo nechceš, něco to vypovídá o tvém charakteru. Tím, že's to takhle vyhrotil, napsal's mi tučným písmem něco, co se ukázalo ze všech úhlů jako nepravda, nezbývá než konstatovat, že ses ztrapnil ty sám - svým vlastním přičiněním. Ale kdo ví - třeba to pro tebe může být moment, ze kterého se poučíš.
    Nic proti tobě, Davide, nemám, ale po této interakci vím jistě, že od tebe určitě nebudu chtít žádnou radu, žádné řešení, žádnou zakázku, ať už bys v tom kterém oboru byl sebelepší. Jeden z těch vícero důvodů je ten, že za celou tu dobu s tvými chybnými a arogantními odpověďmi jsi pouze mrhal mým časem. Myslím, že jsem dostatečně vysvětlil, proč si za tím stojím a proč to tak je.
    Měj se hezky, přeji ti pěkný zbytek prázdnin a třeba více sebereflexe při dalším tvém působení na tomto fóru! ;-)
  • 23. 7. 2018 18:53:51
    https://webtrh.cz/diskuse/funkce-s-vice-argumenty-predavanymi-byref/#reply1356205
    Pro odpověď se přihlašte.
    Přihlásit