Autor Zpráva
xlifer
Profil
Nevím jak nejlépe vyřešit situaci, kdy potřebuji mít ve funkci přístupné proměnné, které předem všechny neznám a časem můžou být další nové.

Předesílám, že se jedná o procedurální kód a není to objektově.

Mám funkci:

function zobraz_formular($id_formular, $akce, $sekce)
{
...
}

Funkce mi zajišťuje vygenerování formuláře na různých místech webu.

V sekcích používám různé proměnné, které bych potřeboval mít přístupné ve funkci zobraz_formular().

Nepraktické pro mne je předávat do funkce předem známé proměnné, zobraz_formular($id_formular, $akce, $sekce, $nazev, $pocet, $dalsi, ...)

Ve funkci můžu použit podmínku podle $sekce a nastavit přístupnost proměnných přes "global", tzn.

function zobraz_formular($id_formular, $akce, $sekce)
{
 if ($sekce == "sekce1")
 {
   global $nazev, $pocet;
 }
 if ($sekce == "sekce2")
 {
   global $dalsi, $jmeno;
 }
}

Dále mě napadlo, že bych si proměnné předával přes array pole a přistupoval bych k proměnným přes toto pole:

function zobraz_formular($id_formular, $akce, $sekce, array $dalsi)
{
 if ($sekce == "sekce1")
 {
   $nazev = $dalsi['nazev'];
   $pocet = $dalsi['pocet'];
 }
}

Nevýhoda je v tom, že před voláním musím array pole nejdříve naplnit, ale byla by to daň, za tento styl použití.

Na druhou stranu je toto řešení výhodné v tom, že přes array pole můžu do funkce poslat jakýkoliv další parametr a nemusím předem znát seznam parametrů, které chci do funkce předávat. Je to vlastně takové předávání jako přes JSON formát.

Jasně, že tento způsob znepřehledňuje kód, protože na první pohled není zřejmé s jakými parametry funkce pracuje, ale toto bych zde neřešil, nejedná se o projekt na kterém se bude podílet někdo další, je to moje sólovka.

Je lepší, použít global, nebo array pole? Mimo doporučení přejít na objektové programování, kde se tento problém asi vyřeší tím, že objekt si drží, resp. pamatuje přiřazené proměnné v rámci instance.

Global je výhodný v tom, že odkazuje na proměnnou, která již existuje, resp. je v paměti a použije se pouze reference na ní. Oproti array, kde musí v paměti vzniknout nová proměnná, kterou následně předám v podstatě stejně jako přes global, ale jinak :-)

Možná jsem si na všechny otázky už odpověděl sám, ale i tak mi to stále vrtá hlavou a rád bych zde slyšel názor, který mi asi pomůže myšlenku zpracovat.
Kcko
Profil
xlifer:
na global zapomen proboha!

Pokud nevíš dopředu a bude se to rozrůstat a neumíš OOP, tak si předávej pole.

Tj

funkce($options = array());
Beavis
Profil
Oproti array, kde musí v paměti vzniknout nová proměnná
Vytvoření nové proměnné, která má racionální využití, nevidím jako problém. Řešit využití paměti (resp. váhat nad vytvoření jedné proměnné navíc) má smysl až u komplexnějších aplikací.
xlifer
Profil
Kcko:
Ok, děkuji za názor. A můžu se jen zeptat, z jakého důvodu nedoporučuješ global ve funkci použít?

Pokud vím, tak global není ani v PHP 7, uveden jako deprecated.

A v tomto konkrétním případě se jedná pouze o globalizování proměnné do funkce, kde ji potřebuji pouze přečíst. Asi narážíš na to, že je pak kód nepředvídatelný v tom smyslu, že se globalizovaná proměnná může, kdekoliv změnit a je to pak nepřehledné i pro ladění aplikace, ale to není tento případ.

I tak děkuji za názor.


Beavis:
Super, děkuji i za tento názor. Myslel jsem si to také, ale chtěl jsem ještě nezávislé potvrzení.
Tomášeek
Profil
xlifer:
Pokud vím, tak global není ani v PHP 7, uveden jako deprecated.
To, že není deprecated neznamená, že to není svinstvo a slušný programátor ho nemá ve svém repertoáru. Navíc, když se dá situace elegantně řešit polem parametrů, resp. parametrem typu array.
xlifer
Profil
Tomášeek:
Ok, díky za názor, budu se toho držet, abych úplně nevybočoval z řady. I když nechápu, proč takové svinstvo v PHP 7 už dávno nevyřadili do deprecated.
blaaablaaa
Profil
xlifer:
V kódu by mělo být vždy jasné odkud se data berou. Za rok se k projektu vrátíš a budeš chtít zavolat svou funkci, IDE ti napoví, jaké parametry funkce očekává, ale o tom, že tam mají být nějaké globální proměnné (a jaké) se už nedozvíš. Navíc globální proměnnou můžeš v té funkci omylem přepsat, což ovlivní celý projekt.

Je špatné psát funkci, u které se vstupy mohou měnit. Možná zkus spíš napsat, čeho chceš docílit a třeba to půjde vymyslet jinak, lépe.
Kcko
Profil
xlifer:
Vem si, že přijdeš k projektu, který používá funkce a v nich globální proměnné. Odkud se vzaly, kde jsou definované? V souboru 1.php? Nebo 2.php, nebo v /modul/frotnend/shit.php ?
Ok, najdeš si to a z hrůzou zjistíš, že Ti v nákupním procesu v 2 kroke funkce vykazuje divná čísla (mějme funkci Kosik()). A proč? Protože sis ty nebo jiný programátor omylem přepsal někde globální proměnnou, protože jste použili stejné jméno proměnné na 2 různé věci.

Proste a jednodušše, odnauč se to a nepoužívej to.

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