WillY- Skrevet 9. september 2011 Forfatter Del Skrevet 9. september 2011 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 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
Occi Skrevet 9. september 2011 Del Skrevet 9. september 2011 (endret) 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 9. september 2011 av Occi Lenke til kommentar
Terrasque Skrevet 9. september 2011 Del Skrevet 9. september 2011 (endret) 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 Endret 9. september 2011 av Terrasque Lenke til kommentar
Occi Skrevet 9. september 2011 Del Skrevet 9. september 2011 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 Takk Lenke til kommentar
Terrasque Skrevet 9. september 2011 Del Skrevet 9. september 2011 (endret) 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 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 9. september 2011 av Terrasque Lenke til kommentar
Occi Skrevet 9. september 2011 Del Skrevet 9. september 2011 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
Terrasque Skrevet 9. september 2011 Del Skrevet 9. september 2011 (endret) 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 9. september 2011 av Terrasque Lenke til kommentar
Occi Skrevet 9. september 2011 Del Skrevet 9. september 2011 Takker for infoen, men tror nok jeg må prøve litt selv først før jeg skjønner det helt ja! Lenke til kommentar
WillY- Skrevet 9. september 2011 Forfatter Del Skrevet 9. september 2011 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 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å