Autor | Zpráva | ||
---|---|---|---|
Manny Profil |
#1 · Zasláno: 17. 12. 2013, 08:04:07
Měl bych malý dotaz.
Nakolik je efektivní používání globálních proměnných ve funkcích ( global $promenna ) pokud je komplikované je předat jako běžný parametr.
Nebude to zbytečně zatěžovat script pokud jich bude třeba 5? |
||
Alphard Profil |
#2 · Zasláno: 17. 12. 2013, 08:20:00
S výkonem problém není, spíš s přehledností. Je lepší se globálním proměnným vyhnout.
|
||
Manny Profil |
#3 · Zasláno: 17. 12. 2013, 08:23:45
Alphard:
S přehledností problém nemám:-) Na začátku funkce si proměnné definuju a je to. Spíš mě zajímá, jestli je to správný postup a jestli v tom nejsou nějaké zákeřnosti. |
||
anonymní Profil * |
#4 · Zasláno: 17. 12. 2013, 08:26:33
Manny:
„jestli je to správný postup“ není, raději předávej parametry (jde to) a na globální proměnné zapomeň. |
||
Joker Profil |
#5 · Zasláno: 17. 12. 2013, 08:55:25
Manny:
„Na začátku funkce si proměnné definuju a je to.“ A pak v nějaké situaci bude v té funkci globální proměnná mít jinou hodnotu než by měla mít. A včil mudruj, jak se tam ta špatná hodnota dostala. „Spíš mě zajímá, jestli je to správný postup a jestli v tom nejsou nějaké zákeřnosti.“ Je to chybný postup a jsou v tom zákeřnosti. Jednak viz výše, hledání některých problémů je hodně složité, jednak pak má funkce závislosti na okolním kódu, takže nejde jednoduše vzít a přenést jinam. |
||
Manny Profil |
#6 · Zasláno: 17. 12. 2013, 09:18:30
anonymní, Joker:
Díky za názory. Samozřejmě, že můžu normálně předat parametry. Ale jde mi konkrétně o situaci, kdy si uživatel může definovat parametry sám - takový modul. Většinou jsou potřeba cesty k souborům, které využívá i okolní kód. A čím méně toho uživatel bude muset nastavovat, tím si myslím lépe z hlediska přehlednosti a případných chyb. |
||
juriad Profil |
#7 · Zasláno: 17. 12. 2013, 09:34:02
Tak si vytvoř jedno pole, pojmenované třeba config, které bude obsahovat všechny globální parametry (ve formátu klíč -> hodnota). A takové pole předávej jednotlivým funkcím. Každá funkce si vyzobne, co bude potřebovat.
Také to není nejelegantnější řešení, ale vyhneš se alespoň použití globálních proměnných, které zanáší do aplikace chaos. Těžko vysleduješ, co způsobí změna hodnoty v globální proměnné; vem si, že jeden modul potřebuje nějakou cestu oříznout, tak ji ořízne rovnou v globální proměnné (myslí si, že je to nevinná úprava). Ale pak najednou se aplikace chová úplně jinak, když je ten modul aktivní a když není; mohou začít selhávat porovnání v ostatních modulech, databázové dotazy přestanou vracet výsledky apod. |
||
Joker Profil |
#8 · Zasláno: 17. 12. 2013, 11:17:39
Manny:
„jde mi konkrétně o situaci, kdy si uživatel může definovat parametry sám“ To nemá vliv na to, že se to přesto může do funkce dávat jako parametr. V objektovém programování se dá ještě využít atribut objektu. Například se v konstruktoru převezme konfigurace a uloží do atributu a jednotlivé metody si pak z něj čtou hodnoty. (Jen pozor, že špatným návrhem se takový přístup může zvrtnout prakticky na totéž jako jsou globální proměnné.) |
||
1Pupik1989 Profil |
Já na to používám objekt.
class Config{ const path_to_the_hell = 'http://seznam.cz'; }; function blabla($url){ return Config::path_to_the_hell.$url; }; echo blabla('/email'); Nemusí řešit globální funkce, nebo předávání parametrů a mám klid. //edit: Koukám, že se to syntax highlighteru nějak nelíbí. |
||
martin1312 Profil |
#10 · Zasláno: 17. 12. 2013, 12:32:11
//1Pupik1989: chýba ti tam $, asi preto sa to zvýraznilo zle.
|
||
Joker Profil |
#11 · Zasláno: 17. 12. 2013, 12:41:58
1Pupik1989:
To ovšem není proměnná, ale konstanta. Konstanty se dají vytvářet i „procedurálním stylem“ a nejsou tak problematické jako globální proměnné (protože jejich hodnoty nejde měnit). define("PATH_TO_THE_HELL", "http://seznam.cz"); function blabla($url) { return PATH_TO_THE_HELL.$url; } echo blabla('/email'); |
||
1Pupik1989 Profil |
#12 · Zasláno: 17. 12. 2013, 13:15:01
martin1312: Právěže nechybí.
Joker:Vím že to neumí. Normálně bych použil "final", jenže to je u php jen na metody a třídy, proměnně neprojdou. Šlo by vlastně té třídě nastavit final, poté by to mohla teoreticky být jen statická proměnná. Pokud to tedy v php tak funguje. Čert aby se v tom jazyku vyznal. |
||
Manny Profil |
#13 · Zasláno: 17. 12. 2013, 13:56:12
Joker:
„Konstanty se dají vytvářet i ‚procedurálním stylem‘ a nejsou tak problematické jako globální proměnné (protože jejich hodnoty nejde měnit).“ Moment, to znamená, že konstanty fungují jako globální proměnné? > Manny: > „jde mi konkrétně o situaci, kdy si uživatel může definovat parametry sám“ > To nemá vliv na to, že se to přesto může do funkce dávat jako parametr. Ano to já vím a taky to už částečně dělám. Spíš mi jde o to, jak nejlépu vyřešit situaci, kdy část parametrů zadá uživatel a část si vezme funkce z okolního kódu. |
||
anonymní Profil * |
#14 · Zasláno: 17. 12. 2013, 14:04:37
Manny:
„Spíš mi jde o to, jak nejlépu vyřešit situaci, kdy část parametrů zadá uživatel a část si vezme funkce z okolního kódu.“ je přeci jedno, kdo jaké parametry zadá, ne? Při volání funkce můžeš dosadit nějaké parametry sám a některé od uživatele (z GET, POST, SESSION nebo COOKIE). Nikde není psáno, že buď použiješ výhradně vlastní hodnoty, nebo výhradně hodnoty od uživatele. |
||
Manny Profil |
#15 · Zasláno: 17. 12. 2013, 14:21:55
anonymní:
„je přeci jedno, kdo jaké parametry zadá, ne?“ jasně, jen z přirozené lenosti jsem chtěl jít cestou nejmenšího odporu, ale se zachováním určité míry efektivity:-)) Proto ta původní otázka na globální proměnnou. Pokud by byla funkce jedna s pevně danými parametry, tak je to jednoduché. Ale potřebuju nějak elegantně vyřešit situaci, kdy funkcí bude několik a parametry budou různé. |
||
Joker Profil |
#16 · Zasláno: 17. 12. 2013, 14:40:15
Manny:
„Moment, to znamená, že konstanty fungují jako globální proměnné?“ Ne, konstanty fungují jako konstanty. Proměnná je proměnná protože jde měnit, konstanta není proměnná protože nejde měnit :-) |
||
martin1312 Profil |
#17 · Zasláno: 17. 12. 2013, 18:59:11
1Pupik1989:
áno sorry, som zvyknutý konštanty písať uppercase tak mi to ani nenapadlo. |
||
Kubo2 Profil |
#18 · Zasláno: 17. 12. 2013, 23:02:08
martin1312:
„áno sorry, som zvyknutý konštanty písať uppercase tak mi to ani nenapadlo.“ <?php class Config { const path_to_the_hell = 'http://seznam.cz'; } //... 1Pupik1989: „Koukám, že se to syntax highlighteru nějak nelíbí.“ Skúsil som pred kód pridať <?php - už to zvýrazňuje normálne. Mimochodom, za definíciou triedy a funkcie máš zbytočné bodkočiarky.
<?php class Config { const path_to_the_hell = 'http://seznam.cz'; }; function blabla($url) { return Config::path_to_the_hell.$url; }; echo blabla('/email'); |
||
Časová prodleva: 10 let
|
0