Gå til innhold

[Løst] Objekter/instanser holder seg ikke fra side til side? (OOP)


Anbefalte innlegg

Altså.. I spillprogrammering bruker jeg objekter hele tida. Mens i PHP så blir det jo ikke objektene værende fra side til side. F.eks hvis man oppretter et objekt av en abstrakt User klasse med brukernavn og annen informasjon om brukeren, så vil ikke det lagres fra side til side. Man må jo assigne objektet på nytt for hver side eller refresh. Hvis det idet hele tatt ga mening :p

 

Mulig jeg ikke har kommet over noen eksempler enda i PHP der det hadde lønt seg med å opprette et objekt isteden for å bare bruke static. Akkurat nå bruker jeg klasser mer for og bare organisere funksjoner.

Lenke til kommentar
Videoannonse
Annonse

Det er derfor du bør legge objektene over i sessions i stedet for å legge variable direkte. Husk bare å ha session_start() og å inkludere/definere klassene på hver eneste side du skal ha tilgang til objektet i sessionen, ellers blir den uleselig.

 

Om du ikke har lest deg opp på session så er det rett og slett bruk av en hashet cookie, som kun er tilgjengelig så lenge man er tilkoblet host (avslutter du fane/nettleser dør sessionen). Man må alltid ha session_start() med for at det skal fungere. Merk at du må også alltid inkludere/definere klassene som definerer eventuelle objekter i session-arrayen før du tar session_start(). Jeg har tatt riktig rekkefølge i scriptene nedenfor.

 

Forbehold om feil, har ikke testet det selv, men det viktige her er hvordan systemet fungerer, bugs er lett å fikse.

 

Klassedefinisjonen (merk at det er konstruktør, og ikke bruk av static)

public class User
{
private $username, $name, $age; // tilgjengelig internt i klassen/objektet, 
                               	// kan brukes på tvers av funksjoner

public function __construct($username, $name, $age)
{
   	$this->username = $username;
   	$this->name = $name;
   	$this->age = $age;    	
}

public function getUserInfo()
{
   	// litt usikker om det kanskje må være "return new array()" her, får ikke testet nå
   	return array("username" => $this->username, "name" => $this->name, "age" => $this->age);
}
}

Første side hvor du oppretter et objekt.

require("classes/user.php");

session_start();

$_SESSION['user'] = new User("ola123", "ola nordmann", 21);

 

Neste side hvor du trenger info fra User-objektet igjen. Tilgjengelig så lenge sessionen er bevart (se over).

require("classes/user.php");

session_start();

$user = $_SESSION['user'].getUserInfo(); // her er da $user et array som er fra getUserInfo

echo $user['username']; // vil da gi "ola123"

Endret av Occi
Lenke til kommentar

Vel, du må hente ut informasjonen uansett for hver refresh.. Om det gjøres via et objekt instans eller via funksjoner som så returnerer en variabel med en id eller array.. er vel samme kaka.

 

Men det er som oftest lettere å minimere DB calls, og bruke caching og lignende ved å bruke objekt instanser. Det gjør som oftest koden ryddigere også.

 

Edit : Occi viser det mye bedre :D

Endret av Terrasque
Lenke til kommentar

Men det er som oftest lettere å minimere DB calls, og bruke caching og lignende ved å bruke objekt instanser. Det gjør som oftest koden ryddigere også.

Greit nok at det er god vane å minimere DB-kall på ting som ikke skal lagres permanent eller over lengre tid, men med dagens hardware tar det jo ikke så lang tid uansett, ved mindre det er heavy selvfølgelig :)

 

Edit : Occi viser det mye bedre :D

Takk :)

Lenke til kommentar

Men det er som oftest lettere å minimere DB calls, og bruke caching og lignende ved å bruke objekt instanser. Det gjør som oftest koden ryddigere også.

Greit nok at det er god vane å minimere DB-kall på ting som ikke skal lagres permanent eller over lengre tid, men med dagens hardware tar det jo ikke så lang tid uansett, ved mindre det er heavy selvfølgelig :)

 

Sant det, men det er som regel ganske lurt å skrive koden med slikt i tankene. Skaper også ryddigere kode :)

 

Er også deilig et par måneder fra nå, når ting virkelig begynner å ta av, å vite at du trenger bare endre EN plass i koden for f.eks legge til memcache, eller endre på database strukturen :D

 

Stor fan av DRY prinsippet, og forsåvidt KISS prinsippet :)

 

Edit: Bare for å presisere, tenker ikke "Oi, må lage slik at alt er dekket uansett, og den skalerer til himmels og greier", men heller "skriv det slik at hvis du vil endre på det senere, er det lett å gjøre".

 

Som et eksempel kan jeg ta en kamerat av meg, som har en nettside skrevet i php.. For over 10 år siden.. På den tiden hadde ikke PHP så mange snasne ting (som OOP støtte), og programmerings-stilen var mer så-som-så. Funksjoner som er spredd utover som gjør det samme / nesten det samme, inline kode som gjør forskjellige queries og endringer, the works.

 

Når han nå legger inn memcache for å avlaste DB'en (som allerede er flyttet på egne maskiner, og har master / slave oppsett), så må han gå igjennom og oppdatere hver eneste php fil omtrent, og kan ikke ha så lang cache tid på ting, siden han enda ikke har fått oversikt over alle plasser som gjør relevante endringer.

 

Hadde han i det minste samlet logikken i funksjoner, og samlet nesten like funksjoner i en funksjon (eller evt la en funskjon calle en annen, relevant funksjon istedet for å copy/paste kode), så hadde det vært mye enklere. Hadde sannsynligvis halvert størrelsen på koden også.

 

Det koster kanskje litt ekstra i begynnelsen, men du tjener forferdelig mye på det over tid. Og objekter gjør det enda enklere, siden du ikke bare kan samle sammen relevant logikk, men også relevant data.

Endret av Terrasque
Lenke til kommentar

Har ikke selv noen erfaring med cache, hvor vanskelig vil du si det er å lære seg? Er ikke så dreven at jeg har laget såpass store sider at det har vært noen nødvendighet enda, har holdt med sessions og mysql. Beklager delvis off topic, men det er relatert til lagring av data/objekter :)

Lenke til kommentar

Har ikke selv noen erfaring med cache, hvor vanskelig vil du si det er å lære seg? Er ikke så dreven at jeg har laget såpass store sider at det har vært noen nødvendighet enda, har holdt med sessions og mysql. Beklager delvis off topic, men det er relatert til lagring av data/objekter :)

 

Vel, logikken er relativt enkel.. Dette er i python'ish psuedokode, siden jeg sjeldent skriver i php..

 

timeout = 30*60 // 30 minutter

def load():
value = cache.get("key")
if not value:
  value = generate_value() // DB lookup, html rendering, query ekstern server osv
  cache.set("key", value, timeout)
return value

def save():
save_value()
either:
  cache.delete("key") // Om du er usikker på hvor ofte dataene accesses
or:
  cache.set("key", generate_value(), timeout) // Hvis du vet at dataene vil bli accessa ganske snart

 

Problemet er hovedsaklig å invalidere cache'n. Du vil ikke vise gammel data til brukeren. Å invalidere gammel data er kritisk hvis du har tenkt å bruke cache effektivt (flere dagers timeout). Hvis du har en funksjon for å hente data, og en funksjon for å lagre / oppdatere data, så er det enkelt å legge til. Er verre hvis det skjer "overalt" i koden.

 

Når det gjelder ytelsesmessig forskjell, så kan det være ganske stor i noen tilfeller. På ene siden jeg har så henter den ut en liste med data fra 6 tabeller, som resulterer i noen ganske stygge joins. Er også en del logikk involvert i å generere html koden for den. Videre, når den listen oppdateres, så blir den automatisk oppdatert via AJAX, så det betyr at 100+ brukere spør om den siden samtidig (som også gjør at DB cache og output cache var litt borked, siden de fleste requestene kom før første request var ferdig).

 

Siden all endring gikk igjennom samme funksjon, så var det enkelt å legge inn en linje for å re-generere listen og lagre i cache før oppdaterings-eventen ble sendt ut. Sluttresultatet var en ganske merkbar forbedring i oppdaterings-hastighet og server load :)

Endret av Terrasque
Lenke til kommentar

OK, ga litt mere mening nå. Men holder meg bare til static foreløpig. Kommer sikkert behov for objekt instanser senere.

 

 

Beklager delvis off topic, men det er relatert til lagring av data/objekter :)

Bare prat ivei, all informasjon er nyttig :D

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...