Gå til innhold

Hva er raskest? global keyword eller $GLOBALS?


Anbefalte innlegg

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 ;)

6256088[/snapback]

 

Singelton betyr at du bare kan lage et objekt, og at alt du oppretter blir referanser til det.

Tenk deg følgende:

 

$registry = Registry::getInstance();
$registry2 = Registry::getInstance();
function foo($bar) {
 $localRegistry = Registry::getInstance();
 $localRegistry->setEntry('username', $bar);
 $localRegistry->save();
}
echo $registry->get('username');

 

Da vil echo-en inneholde rett verdi.

Singleton er da faktisk en global in disguise da på enkelte ting er globaler kjekt. Men man oppnår mange fordeler ved å bruke et objekt, en del skop-ting blant annet.

Lenke til kommentar
Videoannonse
Annonse

Så når jeg pusler med dette til faktisk bruk så blir det slik jeg gjør det:

(Utifra classene som er gitt nederst i linken jeg ga i forrige post:

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

(Ikke i en class dette vel og merke :))

 

<?php

$registry = new Registry::instance();
$registry->setEntry('username', $username);
$registry->save();

function foo()
{
   $usernameinfunction = Registry::getEntry('username');
}

?>

 

Vil nå $usernameinfunction inneholde det samme som $username utenfor funksjonen?

Evt. hvordan skal jeg sette opp dette? Må ærlig innrømme at jeg ikke kan mye OOP, og dette forvirret meg spesielt :p

 

Takker så mye for hjelp og tålmodighet forresten :D

Endret av Jonhoo
Lenke til kommentar

Det var det jeg også mente at burde fungere så fint, men Findus er sterkt imot globals virker det som...

 

Problemet, hotstian, er at jeg skal hente flere variabler i forskjellige funksjoner, og lurer på om det er noen annen måte å gjøre dette på en globals.. (Fordi Findus mener at det ikke er noe bra...)

Lenke til kommentar

OOP kan være litt vanskelig å lære, og oop design kan være ganske vanskelig å få tak på. I utgangspunktet tror jeg feilen din ligger i at du sender inn variabler til funksjoner via bakdører i stedet for som parameter. Registry vil bare være en litt bedre løsning enn globals her, men alt kan brukes feil, globals har ikke enerett på det :)

 

Man har sjeldent bruk for enkelte variabler absolutt over alt, brukernavn er i alle fall noe som du antageligvis bare behøver et par-tre plasser i koden om du skriver god kode uten å repetere kode.

 

Jeg tror egentlig jeg vil anbefale deg en bok som omhandler OOP-design i PHP5, PHP 5 Objects, Patterns and Practice, en særdeles bra bok som er pensum for alle som skriver noe mer enn "hello world" i php.

Lenke til kommentar

Heh, variablen $username var egentlig bare noe jeg fant på... Jeg skal sende variabler som:

 

hashen $userdata som inneholder all info om en bruker som trengs i nesten alle funksjonene mine

 

variablene $totusrs, $getstring og $selfname som alle tre blir generert i starten av scriptet gjennom MySQL queries og sammensetninger av diverse $_GET verdier. Disse brukes også i mange av funksjonene.

 

Det jeg vil ha muligheten er til enkelt å få tilgang til disse fra inne i en funksjon. Jeg har alt skrevet 4000 linjer kode uten OOP, og dette spesielt fordi jeg ikke utvikler noe som skal kunne adapteres til andre sider. Dette er et system som kun skal brukes på _min_ side :)

Lenke til kommentar
Heh, variablen $username var egentlig bare noe jeg fant på... Jeg skal sende variabler som:

 

hashen $userdata som inneholder all info om en bruker som trengs i nesten alle funksjonene mine

 

variablene $totusrs, $getstring og $selfname som alle tre blir generert i starten av scriptet gjennom MySQL queries og sammensetninger av diverse $_GET verdier. Disse brukes også i mange av funksjonene.

 

Det jeg vil ha muligheten er til enkelt å få tilgang til disse fra inne i en funksjon. Jeg har alt skrevet 4000 linjer kode uten OOP, og dette spesielt fordi jeg ikke utvikler noe som skal kunne adapteres til andre sider. Dette er et system som kun skal brukes på _min_ side :)

6258195[/snapback]

 

Jeg har tatt det for gitt at det du programmerer er dette, og at du dermed har behov for ganske bra design av applikasjonen. Er det noe kun du kommer til å jobbe med 150% sikkert, og det aldri skal brukes andre steder, igjen 150% sikkert, så kan man jo bare skrive så dårlig og ustrukturert man vil selvsagt, det er bare man selv som får svi. Og så lenge levetiden på koden er lang nok så får du svi for å herje rundt med globals etc i vilden sky. Det viser samlet erfaring fra hele programmeringsbransjen gjennom mange år.

 

Men men, jeg tenkte bare jeg skulle prøve å spre litt best practice her på forumet - noe det er en relativt stor mangel på nemlig :)

Lenke til kommentar

Skjult tekst: (Marker innholdet i feltet for å se teksten):

Jupp, det er det prosjektet :)

 

Det er ikke noe kun jeg kommer til å jobbe med, MEN

det er sikkert at det ikke skal brukes andre steder.

 

Jeg vil gjerne høre på dette registry tingene av den enkle grunn at jeg _vil_ bedre kodingen min, hvis jeg ikke ville det så ville jeg ha forlatt denne tråden for lenge siden :)

 

Så lurer jeg på, kan jeg nå sette det opp slik?

 

<?php

$registry = new Registry::instance();
$registry->setEntry('userdata', $userdata);
$registry->save();

function foo()
{
   $userdatainfunction = Registry::getEntry('userdata');
}

?>

 

Vil nå $userdatainfunction inneholde det samme som $userdata utenfor funksjonen?

 

Jeg har nå bestemt meg for ganske enkelt å passe all informasjonen når jeg kaller funksjonen istedenfor, gjør det så mye enklere :)

Endret av Jonhoo
Lenke til kommentar

<?php

$registry = new Registry::instance();
$registry->setEntry('userdata', $userdata);
$registry->save();

function foo()
{
  $userdatainfunction = Registry::getEntry('userdata');
}

?>

funksjonen bar er avhengig av at $username er definert "ett eller annet sted", hva som om den ikke er det?

Poenget er å gjøre koden så uavhengig som mulig, og globals forhindrer dette, i tillegg til at globals gjør debug en del vanskeligere.

Det vil jo være det samme som at Entry userdata er ikke er definert.

 

OOP er uansett den beste løsningen.

Lenke til kommentar
Hva er tankene rundt bruk av $_POST, $_GET og andre superglobals?

Disse _vet_ du er satt, på en eller annen måte, er de like fyfy?

6264697[/snapback]

request-variabler er en litt annen sak, men ideelt sett så bør du abstrahere bort de og ja, da vil nemlig koden din med enkle grep kunne fungere i andre miljø som f.eks cli.

Her har du litt code smell:

 

class FooLib {
 function fooify() {
   $name = $_GET['name'];
 }
}

 

Request-data innkapsles ofte med et request-objekt (request pattern). Hva man velger å gjøre bør avhenge av størrelsen på prosjektet. Er det en enkelstående form som skal skrive noe til en database så skriver man det så enkelt som overhodet mulig. Er det et prosjekt med måneders utviklingstid og 10-20k kodelinjer blir det noe litt annet.

 

Til syvende og sist er det jo litt smaksak om man bruker OOP, og absolutt delte meninger om hvorvidt OOP er en bedre måte å skrive kode. Jeg er ikke i tvil om at tllnærmet ren OOP er det jeg synes er best, jeg er XP-light vil jeg si. TDD er fint men jeg gjør det ikke 100% av tiden, parprogrammering er fint men jeg har ikke så stor mulighet for å utøve det, osv.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...