Gå til innhold

Hva er raskest? global keyword eller $GLOBALS?


Anbefalte innlegg

Heisann folkens :)

 

Jeg programmerer for øyeblikket en rimelig stor side i PHP 5, og den må være så effektivt kodet som mulig. Det har gått veldig radig til nå, men nå har jeg altså støtt på et problem, det er som følger:

 

//Jeg har en funksjon (La oss kalle den evalstr() )

function evalstr($string = NULL) //Her vil jeg at det skal være _en_ optional varible
{
   $string = ($string == NULL ? $GLOBALS['string'] : $string);

//Hva skal jeg ha her? Hvis $string ikke har blitt passet til funksjonen så vil jeg at den skal bli satt til den globale $string.. Bruker her $GLOBALS['string'], men merket at scriptet ble veldig mye tregere av det...

}

 

Noen som kan hjelpe?

Er det mulig her å bruke:

 

if ($string == NULL)
{
   unset($string);
   global $string;
}

 

Hvilken vil være raskest? Evt. er det en annen måte å gjøre dette på?

 

På forhånd takk :)

Lenke til kommentar
Videoannonse
Annonse

Enhver php-kodebase med noe som ligner "global $string;" er dårlig, punktum.

Det finnes ganger der globals er fornuftig å bruke, sjansen for at man havner i den situasjonen er lik null dog, og det er garantert ikke fornuftig å gjøre en string global _uansett_ situasjon.

 

Så, hva som er mest effektivt blir ganske likegyldig i grunn. Og jeg kan egentlig ikke komme med tips om hvordan du ellers skal løse problemet ditt siden jeg ikke vet hva prolemet er :)

En grei oppsummering av hvorfor globaler er ondskap finner du f.eks her.

 

Dessuten ser den funksjonen din alt annet enn god ut. En funksjon som evaluerer en string og har parameter som er valgfritt er code smell så det holder.

Lenke til kommentar

hehe, er jo ikke akkurat sånn funksjonen ser ut på ordentlig da ;) Den egentlige funksjonen tar en stor array med brukerdata...

 

Men ja, jeg ser hva du mener nå, og etter å ha lest artikkelen... :)

Skal skrive om hele funksjonen nå, UTEN globals, men lurer på en ting..

Vil det være helt gæli å bruke for eksempel database brukernav, passord og adresse som globals også?

 

Altså sånn at jeg slipper å declare brukernavn, passord, adresse og slikt (som er helt likt) i alle funksjonene som bruke MySQL connection?

 

Jon

Endret av Jonhoo
Lenke til kommentar
Skal skrive om hele funksjonen nå, UTEN globals, men lurer på en ting..

Vil det være helt gæli å bruke for eksempel database brukernav, passord og adresse som globals også?

6242492[/snapback]

 

Dette er konfigurasjonsdata som bør lagres i en egen config-fil av en eller annen type.

Du kan løse det ved å bruke en ferdig config-klasse, f.eks PEAR::Config

. Eller skrive en selv, bruke en funksjon.

Bruker du noe ferdig sparer du deg tid, bare husk å bruk noe med rett lisensiering :)

Lenke til kommentar

Jeg har allerede en ekstern PHP fil med config som includes i starten av hvert dokument.. Men variablene i den blir jo ikke suberglobals så jeg kan få tilgang til dem fra hvor som helst...

 

EDIT: Hmm.. Hvorfor er den metoden din noe bedre enn globals?

 

Jeg definer variabler med databasepassord og slikt i én fil, og så har jeg en annen fil hvor jeg skal ha tilgang til disse variablene i en funksjon.. Er det ikke da både lettes og mest effektivt å bruke global??

Endret av Jonhoo
Lenke til kommentar
Jeg har allerede en ekstern PHP fil med config som includes i starten av hvert dokument.. Men variablene i den blir jo ikke suberglobals så jeg kan få tilgang til dem fra hvor som helst...

 

EDIT: Hmm.. Hvorfor er den metoden din noe bedre enn globals?

 

Jeg definer variabler med databasepassord og slikt i én fil, og så har jeg en annen fil hvor jeg skal ha tilgang til disse variablene i en funksjon.. Er det ikke da både lettes og mest effektivt å bruke global??

6244503[/snapback]

Metoden min belager seg ikke på globals, derfor er den bedre :)

Konstanter er bedre siden de ikke kan overskrives. Jo større systemet ditt blir jo større er sjansen for at noen som koder på det plutselig overskriver en av konfigurasjonsglobalene dine. Og da har du helvete løs for å si det mildt.

Det er også vanskelig å vite hvor disse globalene kommer fra, mens med Config::DB_USER så vet du at de ligger i config-klassen. Som du da (Gitt at du har en saklig struktur) vet ligger i Config.php-filen på en bestemt plass.

 

Så bedre lesbarhet og mer sikkerhet.

Lenke til kommentar

Hmm, jeg har fått et problem til...

 

Jeg vil lage en funksjon som utifra de variblene den får lager en ny klasse, men det fungerer ikke...

 

Litt forenklet er funksjonen slik:

 

function makeuservarsclass($username)
{
   class Uservars
   {
       const USERNAME = $username;
   }
}

 

Går det ikke an å gjøre dette? Får feilmelding på første linjen med const...

Endret av Jonhoo
Lenke til kommentar
Hvordan da?

 

Målet er at jeg skal kunne hente ut dette igjen med:

 

$username = Uservars::USERNAME;

Hvor som helst i koden.. (Spesielt da inne i funksjoner)

6245273[/snapback]

 

Hvorfor definerer du klassen inne i en funksjon? Det er svært uryddig.

Jeg vil anbefale deg å definere klasser i egne filer for det første, og aldri inne i funksjoner i alle fall.

Dessuten prøver du å sette en konstant runtime, det sier seg selv at du får feilmelding da.

Lenke til kommentar

For å forklare:

 

Jeg har mange funksjoner som alle bruker de samme variablene.. Jeg vil finne en bedre måte å bruke dem på enn å måtte sende med de samme variablene til alle sammen hver gang de skal calles..

 

Variablene settes i starten av "hovedscriptet" utifra diverse ting som kommer fra $_POST, MySQL og en variabel kalt $userdata..

 

Hvordan kan dette gjøres?

Lenke til kommentar

Mitt system bruker en klasse Config som er en singleton, og kan derfor kun opprettes ved bruk av funksjonen Config::create() som en en statisk funksjon som returnerner et Config-objekt. Dersom objektet allerede er opprettet, så returnerer den det opprettede objektet, ellers returnerer den et nytt objekt.

Lenke til kommentar

Jeg har nå funnet en helt annen løsning...

 

Jeg fant ut at jeg må kunne modifisere de variablene også... Så å kun hente dem ut vil ikke hjelpe..

 

Derfor laget jeg en funksjon kalt getvar()

function getvar($varname)
{
   $varname = strtolower($varname);
   global $$varname;
   return $$varname;
}

Deretter i funksjonen hvor jeg trenger for eksempel $username gjør jeg:

foo()
{
   $username = getvar('USERNAME');
}

og voillá, der har vi det :)

Jeg vet at jeg bruker global her, men det fungerer veldig fint, og blir ikke rotete.

 

Takk for all hjelpen alikevel... Det å bruke OOP -> CONST for databaseinstillinger fungerte veldig bra :)

 

Jon

Endret av Jonhoo
Lenke til kommentar

Det du vil ha er et registry som er singleton. Den metoden du har valgt nå er (no offence) noe av det værste jeg har sett.

Google litt etter en tutorial på registry i php, jeg vet de finnes. Hvis ikke kan du finne bra eksempel på implementasjoner på andre forum (jeg vil anbefale advanced php på sitepoint).

Lenke til kommentar

Hmmm.. Har nå sett litt på:

 

http://www.phppatterns.com/docs/design/the_registry

 

Men her når du lager registeret ved for eksempel:

 

$registry = &new Registry();

 

Så må jo variabelen $registry bli gjort tilgjengelig inne i funksjonen... Hvordan gjør jeg det uten global..?

 

Hvis jeg bruker dette i starten av scriptet mitt for å sette verdiene i registeret:

 

$registry = &new Registry();
       $a = 'a';
       $registry->setEntry($username, 'username');
       $registry->save();

 

så kan jeg jo ikke kjøre dette i en funksjon senere da $registry da ikke er deklarert (inne i funksjonen)

 

function foo()
{
   $username = $registry->getEntry('username');
}

 

Altså har vi samme problemet igjen...

 

Og hva er egentlig forskjellen på "A registry class" og "A singleton registry" ?

Jeg skjønner at den ene bruker singleton, og den andre ikke, men hva vil det si i praksis?

 

Jeg vet at jeg kanskje er litt uvitende her, men bruker lite/ingen OOP ;)

Endret av Jonhoo
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...