Jonhoo Skrevet 4. juni 2006 Del Skrevet 4. juni 2006 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
Nervetattoo Skrevet 4. juni 2006 Del Skrevet 4. juni 2006 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
Jonhoo Skrevet 4. juni 2006 Forfatter Del Skrevet 4. juni 2006 (endret) 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 4. juni 2006 av Jonhoo Lenke til kommentar
genstian Skrevet 4. juni 2006 Del Skrevet 4. juni 2006 Bruk OOP: Eks: class a { var $db = 'mydb'; function bb() { echo $this->db; } Lenke til kommentar
Nervetattoo Skrevet 4. juni 2006 Del Skrevet 4. juni 2006 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
Nervetattoo Skrevet 4. juni 2006 Del Skrevet 4. juni 2006 Dog, om hastighet er viktigst så lager man konfig på en lignende måte: (krever php5) class Config { const DB_USER = 'username'; const DB_PASS = 'asdf'; } echo Config::DB_USER; Det er vell den enkleste saklige måten å gjøre det på, og raskest. Lenke til kommentar
Jonhoo Skrevet 5. juni 2006 Forfatter Del Skrevet 5. juni 2006 (endret) 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 5. juni 2006 av Jonhoo Lenke til kommentar
Nervetattoo Skrevet 5. juni 2006 Del Skrevet 5. juni 2006 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
Jonhoo Skrevet 5. juni 2006 Forfatter Del Skrevet 5. juni 2006 Ah, takk skal du ha Lenke til kommentar
Jonhoo Skrevet 5. juni 2006 Forfatter Del Skrevet 5. juni 2006 (endret) 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 5. juni 2006 av Jonhoo Lenke til kommentar
genstian Skrevet 5. juni 2006 Del Skrevet 5. juni 2006 Nei, tror du må bruke "var $var" ikke "const CONST" for å få det til. Lenke til kommentar
Jonhoo Skrevet 5. juni 2006 Forfatter Del Skrevet 5. juni 2006 (endret) 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) Endret 5. juni 2006 av Jonhoo Lenke til kommentar
Nervetattoo Skrevet 5. juni 2006 Del Skrevet 5. juni 2006 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
Jonhoo Skrevet 5. juni 2006 Forfatter Del Skrevet 5. juni 2006 (endret) Glem det.. Jeg kan ikke kjøre scriptet sånn da jeg må få satt variablene først, og SÅ må de bli gjort tilgjengelige til funksjonene... Noen andre ideer? Endret 5. juni 2006 av Jonhoo Lenke til kommentar
Jonhoo Skrevet 5. juni 2006 Forfatter Del Skrevet 5. juni 2006 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
Nervetattoo Skrevet 5. juni 2006 Del Skrevet 5. juni 2006 Titt litt på OOP, der ligger det en del svar for det jeg tror du skisserer. Du finner masse tutorials på google. Du kan f.eks vurdere et request-objekt som en singleton. Eller et registry. Lenke til kommentar
Peter Skrevet 5. juni 2006 Del Skrevet 5. juni 2006 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
Jonhoo Skrevet 6. juni 2006 Forfatter Del Skrevet 6. juni 2006 (endret) 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 6. juni 2006 av Jonhoo Lenke til kommentar
Nervetattoo Skrevet 6. juni 2006 Del Skrevet 6. juni 2006 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
Jonhoo Skrevet 6. juni 2006 Forfatter Del Skrevet 6. juni 2006 (endret) 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 6. juni 2006 av Jonhoo Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå