[PHP] Voor -en nadelen van globals?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Afgelopen week postte ik een vraag over hoe je bepaalde informatie voor de rest van je applicatie beschikbaar moet maken: via een functie of een global variabele.

Het idee is dus (vereenvoudigd) als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * q is bijvoorbeeld een URL
 */
function q($index)
{
  if (isset($_GET['q']))
  {
    $q  = explode('/', $_GET['q']);
    return $q[$index];
  }
  else
  {
    return false;
  }
}

/**
 * Ergens anders in mijn applicatie wil ik iets over q weten:
 */
function doe_iets()
{
  if (q(2) == 'maandag') return 'het weekeinde is weer voorbij!';
}

Het nadeel hiervan is dat je elke keer opnieuw $q loopt te exploden, wat toch performance kost. Het zou ook zo kunnen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
if (isset($_GET['q']))
{
  $q  = explode('$', $_GET['q']);
}

/**
 * Ergens anders in mijn applicatie wil ik iets over q weten:
 */
function doe_iets()
{
  global $q;
  if (q[2] == 'maandag') return 'het weekeinde is weer voorbij!';
}

Maar het probleem is dat je op deze manier een hele riedel aan te globallen variabelen krijgt. Daarom was mijn idee om alle variabelen die je als global in je functies aan wilt halen, in een global array te stoppen. Iemand anders merkte op: stop die array met variabelen anders in $_SERVER of $GLOBAL; dan hoef je ze niet apart te globallen in je functies.

Om te kijken of dit vaker gebeurt, ben ik wat gaan rondbrowsen op GoT. Toen bleek dat een heleboel mensen absoluut tegen het aanhalen van globals in hun functies zijn, omdat dit onduidelijk zou worden. Hoe je het ook oplost. Maar waarom zou een hoeveelheid aan functies wel overzichtelijk zijn en het gebruik van globale variabelen niet? Ik hoor graag jullie reaktie, want ik weet het niet goed meer. Voor de basis van mijn CMS'je (ben het nu aan het herbouwen) wil ik een keuze maken: of een boel variabelen in een global srray stoppen (of die array weer in bv. $_SERVER stoppen) OF middels functies alles oplossen. Op dit moment heb ik het idee om 2 of 3 variabele array's in $GLOBAL te stoppen, die ik in heel mijn applicatie aan kan halen. Zoiets als:
PHP:
1
2
3
$_CONF (alle configuratie variabelen)
$_NODE (alle variabelen van de huidige pagina (titel, template etc)
$_URL (met info over de url (die ge-explode is)

Wat is hier dan zo tegen? Ik ben bang een verkeerde basis voor het systeem te kiezen, of een te omslachtige methode en hoop dus op enkele beargumenteerde antwoorden, liefst anders dan "hangt van je voorkeur af". :)

[ Voor 8% gewijzigd door Reveller op 01-11-2004 20:11 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Globale variabelen maken functies vaak moeilijk om te hergebruiken. Bovendien snap ik je probleem niet, waarom geef je maar één variabele door in de url, waar méér dan één nuttige waarde in zit? Gebruik dan gewoon meer variabelen, en werk dan gewoon met de GET-array? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

als ik naar mijn functies kijkt, en zie welke parameters er zijn, kan ik meteen in een oogopslag weten welke variabelen er worden gebruikt in die functie. Dat heb je met globals niet.

Bovendien kan je met variabelen in de parameters bepalen wat de scope van die variabelen zijn. Met global is het over het hele project. Wat ook het bughunten een stuk moeilijker maakt.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Nee, de functie die ik geef is slechts een voorbeeld. In werkelijkheid werk ik met mod_rewrite en ontleed ik de gehele URL. Elk deel binnen slashes is informatie voor mij, net als andere delen van de URL. Een voorbeeld URL is: http://www.site.com/fruit/groen/appels/2004/06$print:a3

Deze url wordt gesplitst en de delen worden in een of meer array's gestopt. Maar dat is niet het punt. Het gaat mij om de vraag wat er tegen het gebruik van globals is.

Stel dat je van tevoren weet dat je een specifieke functie schrijft, die later niet hetgebruikt hoeft te worden in een nagenoeg gelijke context, dan is dus het gebruik van global in je functie niet erg?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Zoals al in je vorige topic gezegd was, waarom maak je er geen constante (defines) en dat exploden kost je echt niet zoveel tijd...

Daarnaast maak ikzelf gebruik van een singleton class met hierin alles opgeslagen. Deze class blijft "globaal gealloceerd" en is makkelijk benaderbaar, bijvoorbeeld:

SettingsManager::GetAt("module", "waarde");

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je hoeft er trouwens niet eens een global van te maken. Je leest die GET-var (in dit geval dan) in wanneer je het script binnen komt, en roept een class aan met die geparste GET-var (als array) als parameter. Dan kun je hem in die class als variabele opnemen, en binnen die class aanspreken waar nodig. Werkt prima, en je hebt alle voordelen van portable en duidelijke/overzichtelijke code. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Verwijderd schreef op 01 november 2004 @ 20:08:
Zoals al in je vorige topic gezegd was, waarom maak je er geen constante (defines) en dat exploden kost je echt niet zoveel tijd...

Daarnaast maak ikzelf gebruik van een singleton class met hierin alles opgeslagen. Deze class blijft "globaal gealloceerd" en is makkelijk benaderbaar, bijvoorbeeld:

SettingsManager::GetAt("module", "waarde");
Daar is opzich vrij weinig Singleton's aan, dat is gewoon een static function (merk het verschil tussen een statische functie en variabele op) ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Foo
{
       private function __construct() {}
       public function Singleton ()
       {
              static $Me;
              if (!isSet ($Me))
              {
                     $Me = new Foo();
              }
              return $Me;
       }
}

Is meer mijn idee over een Singleton, maar ik kan er natuurlijk naast zitten. En wellicht is de class zelf wel een Singleton, maar met jou voorbeeld leek het net of die functie zelf de 'Singleton' was.

Waarom schrijf je die waarde's niet terug naar de $_GET array?

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Dat vind ik eigenlijk een heel goed idee - de waardes terugschrijven naar $_GET. Ik heb er eigenlijk nooit eerder bij stilgestaan dat je superglobals als $_GET en $_SERVER ook zelf kunt vullen / aanpassen. Dank iedereen! :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."

Pagina: 1