Autor Zpráva
Budulinek
Profil
Zdravím,

napadlo mě, zda-li jde přeskočit defaultně nastavený argument funkce, aniž by se změnila jeho přednastavená hodnota? Jinak řečeno, mám funkci

nejaka_funkce($arg_a, $arg_b, $arg_c = 123, $arg_d = 987) {...}


při jejímž volání bych chtěl nastavit třeba jen argument d ($arg_d), ale argument c bych chtěl nechat tak, jak je. Můžu zavolat tu funkci nějak tak, aby bych nastavení argumentu c přeskočil? Třeba takto:

nejaka_funkce("a", "b", //o to se nestarej//, 567);


Jde to, nebo je v tomto případě potřeba argument vypasta ručně? Díky za rady a postřehy :)
Nox
Profil
Pokud vím tak to není možné.... ale pokud funkce očekává nějaké neprázdné hodnoty, tak můžeš uvést u "přeskakovaných" NULL a pak kontrolovat is_null() nebo === NULL

nebo to udělat pomocí pole.... ale je to pak hodně psaní navíc
Budulinek
Profil
Nox:
o null vím, ale to není to co, co bych chtěl. Myslel jsem si, že to nejde, ale líná huba... však to znáte.
Mastodont
Profil
Můžeš to udělat tak, že argumenty v hlavičce neuvedeš vůbec a v těle funkce pak použiješ func_num_args a func_get_args, ovšem zkomplikuje ti to kód uvnitř funkce..
Joker
Profil
Mastodont:
Tím ovšem taky nejde přeskakovat argumenty. Pak by v životě nepoznal, jestli func_get_args(2) je $arg_c, nebo jsem ho přeskočil a je to až $arg_d.

Možné řešení, byť ne úplně hezké, by bylo předávat argumenty jako pole:
nejaka_funkce($argumenty){
...
}
nejaka_funkce(array("a", "b", 4=>999));
Budulinek
Profil
Joker:
Taky mě to napadlo, ale asi to nechám tak, jak to je. Ono šlo čistě jen o nepatrný zjednodušení a nemá cenu nad tím nějak hloubat. Řešení s polem sice problém řeší, ale ve finále by to asi vyšlo na stejnou, jako když by se ty argumenty vypisovaly.
Alphard
Profil
[#1] Budulinek
Nebo to udělat objektově, třeba
$o = new Obrazek("png", 200);  // povinný
$o->backgroundColor = "blue";  // nepovinný
$o->safe();

Tohle asi bude řešení málokdy, ale uvádím ho pro úplnost.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0