Autor Zpráva
Manny
Profil
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
S výkonem problém není, spíš s přehledností. Je lepší se globálním proměnným vyhnout.
Manny
Profil
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 *
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
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
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
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
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
//1Pupik1989: chýba ti tam $, asi preto sa to zvýraznilo zle.
Joker
Profil
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
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
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 *
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
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
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
1Pupik1989:
áno sorry, som zvyknutý konštanty písať uppercase tak mi to ani nenapadlo.
Kubo2
Profil
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');

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