Gå til innhold

AJAX og PHP objekter - best måte å 'kommunisere' på?


Anbefalte innlegg

Tror jeg venter litt med å sette meg inn i aggregering og komposisjon :p Men skal ikke se bort ifra at jeg får bruk for eksempelet senere kgun ;)

 

Et spørsmål:

$obj = & $_SESSION['objects]['cCourse'];
$obj->setWhatevz($var);

Vil det endre SESSION direkte som en referanse? Bare litt tungvindt og måtte skrive $_SESSION['objects]['cCourse']->setWhatevz($var) for hver gang :p

 

 

 

Sikker på at du ikke bør revurdere designet ditt en smule? I mitt hode virker det nok å ta vare på informasjon som kan identifisere brukeren og tilhørende data. Jeg ville heller lagret svar på kurs, poengsummer og lignende i en database. Det må da være enklere enn dette du gjør nå?

Jo alt ligger i databasen, og oppdateres når det er gjort endringer på objektet. Poenget var liksom å redusere queries, OG ha et objekt jeg bare kan hente informasjonen direkte fra, f.eks cUser->getTotalPoints() henter ikke direkte fra databasen, men det som er lagra i objektet, som er det samme som ligger i databasen. Meneh.. her kommer et lite problem, og det er å sørge for at objektet til enn hver tid har den samme informasjonen som i databasen :p Men har gått fint så langt ihvertfall.

 

Her har du objektene

Course denne inneholder all informasjon om kurset, men INGEN bruker stats

post-51807-0-88170000-1329383301_thumb.png

 

User denne har BARE bruker stats (består bare av arrays, men skulle EGENTLIG lagd subobjekter til denne også, som i Course)

post-51807-0-28018500-1329383438_thumb.png

Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet+9871234

Tror jeg venter litt med å sette meg inn i aggregering og komposisjon :p Men skal ikke se bort ifra at jeg får bruk for eksempelet senere kgun ;)

Du vet hva Ibsen sa,

 

Det er viljen som teller, den frigjøre eller den feller

 

og kanskje enda mer aktuelt:

 

Utsett aldri til i morgen det du kan gjøre i dag.

 

Ett av mine favoritt sitater er fra Einstein:

 

Make it simple, as simple as possible but no simpler.

 

I den digitale tidsalder ville jeg endret det siste til.

 

Gør det så enkelt og sikkert som mulig, men ikke enklere og sikrere.

 

Gjør du det ikke sikkert nok i utgangspunktet, kan du ende opp med utgått ("depricated") kode ved neste php oppdatering.

 

Eksempler:

 

PDO + Prepared statements om du jobber med databaser.

 

(php) cURL om du jobber med konsumering av webtjenester og import av php scripts.

 

Er du det man vil kalle en ungdom, antar jeg at du leser kode som andre leser donald. :roll:

Endret av Slettet+9871234
Lenke til kommentar
Gjest Slettet+9871234

Vet du hva? Jeg synes mye i matte blir lettere jo mer generelt det er.

 

Matrisealgebra gjør behandling av simultane ligningssystemer mye lettere. Husk at matrisgruppen ikke er abelsk.

 

Dvs.

 

AB = BA

 

bare for symmetriske matriser. Der finnes ferdige bibiloteker til dette i Python hvor man også har såkalt generalisrte inverser.

 

Til dette foretrekker jeg Python fremfor PHP. PHP er språket til å lage web steder er min personlige overbevisning.

Lenke til kommentar

Giddet ikke å lese alt her.. men har noen kommet opp med noen forslag som funker?

 

Slik ville jeg har gjort det:

 

$myObject = new myObject();
//Dette trenger jeg å vite på ett senere tidspunkt
$myObject->setName("Tor");

$_SESSION['myObject'] = serialize($myObject);

 

På ett senere tidspunkt:

 


//Jeg trenger myObject fra forrige side...
$myObject = unserialize($_SESSION['myObject']);
$name = $myObject->getName();

....

//Endrer jeg objektet må jeg også oppdatere det i sesjon
$myObject->setAge(45);
$_SESSION['myObject'] = serialize($myObject);

 

Eller serialiser og lagre informasjonen i en fil hvis det er sensitiv informasjon.

Endret av xibriz
  • Liker 3
Lenke til kommentar

//Abstract klasse som alle klasser som skal lagres i session kan bruke
abstract class SessionObject{

   //Henter objektet fra session
   static function init($id){
       return   unserialize($_SESSION[get_called_class()][$id]);
   }

   //Lagrer objekt i session når det ikke er flere referanser til det
   public function __destruct(){
       $_SESSION[get_called_class()][$this->id]  = serialize($this);
   }

}

class Course extends SessionObject{}

//Henter objektet fra session
$course = Course::init($_GET['id']);

 

Koden over er utestet og jeg vet ikke om jeg ville ha gjort det slik selv.

 

Ellers synes jeg det er rart at flere har nevnt memcache men ingen her nevnt apc. Med apc kan du lagre objekter i minne og i tillegg vil den kraftig forbedre ytelsen på din applikasjon.

Endret av Shetil
  • Liker 1
Lenke til kommentar

Giddet ikke å lese alt her.. men har noen kommet opp med noen forslag som funker?

 

Slik ville jeg har gjort det:

 

$myObject = new myObject();
//Dette trenger jeg å vite på ett senere tidspunkt
$myObject->setName("Tor");

$_SESSION['myObject'] = serialize($myObject);

 

På ett senere tidspunkt:

 


//Jeg trenger myObject fra forrige side...
$myObject = unserialize($_SESSION['myObject']);
$name = $myObject->getName();

....

//Endrer jeg objektet må jeg også oppdatere det i sesjon
$myObject->setAge(45);
$_SESSION['myObject'] = serialize($myObject);

 

Eller serialiser og lagre informasjonen i en fil hvis det er sensitiv informasjon.

 

Det er unødvendig å bruke serialize/unserialize, php fikser det selv.

 

Og så lenge du bruker PHP5 så vil objecter som ligger i $_SESSION automatisk holdes oppdatert, så lenge du ikke cloner dem.

$myObject = new myObject();
//Dette trenger jeg å vite på ett senere tidspunkt
$myObject->setName("Tor");

$_SESSION['myObject'] = $myObject;

 

//Jeg trenger myObject fra forrige side...
$myObject = $_SESSION['myObject'];

$myObject->setAge(45);


$myObject = $_SESSION['myObject'];

$myObject->getAge() == 45;

  • Liker 1
Lenke til kommentar
(Kode)

 

Koden over er utestet og jeg vet ikke om jeg ville ha gjort det slik selv.

 

Ellers synes jeg det er rart at flere har nevnt memcache men ingen her nevnt apc. Med apc kan du lagre objekter i minne og i tillegg vil den kraftig forbedre ytelsen på din applikasjon.

 

Absolutt ikke helt på jordet. Det minte meg på noe. Det vil nok være lurere å bruke PHPs innebygde magiske metoder for å løse dette. Jeg snakker selvsagt om __sleep() og __wakeup(). Sleep og wake up er automagiske, på samme måte som __construct() eller __toString().

 

Kall - Metode som kjøres:

$obj = new Object() - kaller __construct();

echo $obj; - kaller __toString();

serialize($obj); - kaller __sleep();

unserialize($obj); - kaller __wakeup();

 

Ville derfor implementert det noe som dette:


class Course extends SessionObject
{
   // Setter id på objektet. F. eks tilsvarende ID som i en database eller som i "cCourse"
   private $id;

   // Metoden returnerer objektets id
   public function getId() 
   { 
       return $this->id; 
   }

   // Kjøres ved serialize()
   public function __sleep() 
   {
       $_SESSION[get_class()][$this->id] = serialize($this);
       return array_keys(get_object_vars($this)); // dette er sånn php gjør det innvendig.
       // Også mulig å lagee til db/andre eventualiteter
   }

   // Kjøres ved unserialize()
   public function __wakeup($id)
   {
       return unserialize($_SESSION[get_class()][$id]);
   }

}

// Lage objektet
$course = new Course();

// Lagre objektet
serizalize($course);

$course = unserialize($_GET['id']);

 

Min kode er heller ikke testet. Les mer om __sleep() og __wakeup() om det ikke skulle funke.

 

Kan hende jeg misforsto, men sto også noe om at bare public attributter vil kunne serializeres. Godt mulig du må implementere grensesnittet Serializable. Det er jeg litt usikker på. I så fall finner du info her

Endret av Sono Juventino
  • Liker 1
Lenke til kommentar

Den var ikke dum! Det er hvertfall en god løsning hvis det jeg skulle ende opp med _PHP_incomplete_object. Gjorde noen teste uten å serialize, og det gikk jo uten problemer. Men vet jo aldri om det vil oppstå noe senere. Skulle gjerne likt å vite hva som forårsaker _PHP_incomplete_object problemet.

Jeg får ta en test med private attributter også..

 

Men hva er det egentlig folk vanligvis gjør når man kaller på php med ajax? F.eks i en poll. SELECTER/UPDATER dem bare dataen direkte i php scriptet som blir kalt..?

Lenke til kommentar

For å unngå _PHP_incomplete_object må du passe på å inkludere alle classe definisjoner som blir brukt før du prøver å bruke objectene.

 

session_start();

require 'class1.php';

$_SESSION['class1_object']->test();

Endret av FraXinuS
Lenke til kommentar

Sikker på at du ikke bør revurdere designet ditt en smule? I mitt hode virker det nok å ta vare på informasjon som kan identifisere brukeren og tilhørende data. Jeg ville heller lagret svar på kurs, poengsummer og lignende i en database. Det må da være enklere enn dette du gjør nå?

Jo alt ligger i databasen, og oppdateres når det er gjort endringer på objektet. Poenget var liksom å redusere queries, OG ha et objekt jeg bare kan hente informasjonen direkte fra, f.eks cUser->getTotalPoints() henter ikke direkte fra databasen, men det som er lagra i objektet, som er det samme som ligger i databasen. Meneh.. her kommer et lite problem, og det er å sørge for at objektet til enn hver tid har den samme informasjonen som i databasen :p Men har gått fint så langt ihvertfall.

  1. Dersom dette gjelder anonyme brukere, så er det ikke noen god ide å bruke sessions som cache fordi du får en lokal fil på serveren per bruker som ikke blir borte når de ikke behøves mer. Med mange besøkende er det ikke sikkert at dette er bedre enn å kjøre noen ekstra spørringer mot database.
  2. Vi (utviklere) gjetter som regel feil om hvor det lønner seg å optimalisere koden (!), eller hvordan optimalisere for ytelse i dette tilfellet.

 

Jeg ville heller godtatt noen flere spørringer mot database, og senere begynt å cache mest mulig for anonyme brukere og annet som er felles for alle besøkende. Har du ett ytelsesproblem med innloggede brukere (hvor det er naturlig å bruke sessions/cookies for å kjenne igjen bruker og lign.), ville jeg også vurdert designet først og så sett på sessions som ett av alternativene.

Endret av dahuff
Lenke til kommentar

Fant en bra artikkel om dette! http://www.devshed.com/c/a/PHP/Working-with-MySQL-and-Sessions-to-Serialize-Objects-in-PHP/1/

"..Over this series, I covered not only the fundamentals of object serialization in PHP, but also some advanced topics, such as the implementation of the magic “__sleep()” and “__wakeup()” functions, and the usage of objects in sessions. Finally, I completed the series by demonstrating how to store serialized objects in MySQL tables,.."

 

 

For å unngå _PHP_incomplete_object må du passe på å inkludere alle classe definisjoner som blir brukt før du prøver å bruke objectene.

 

session_start();

require 'class1.php';

$_SESSION['class1_object']->test();

Åja, jeg trodde _PHP_incomplete_object var et problem som kom av å ikke serialize. Det har hvertfall kommet mye opp i denne sammenhengen, av det jeg har lest.

 

  1. Dersom dette gjelder anonyme brukere, så er det ikke noen god ide å bruke sessions som cache fordi du får en lokal fil på serveren per bruker som ikke blir borte når de ikke behøves mer. Med mange besøkende er det ikke sikkert at dette er bedre enn å kjøre noen ekstra spørringer mot database.
Hmm ok. Snakker vel om endel brukere da? Men nå krever jeg login da heldigvis..
 
Vi (utviklere) gjetter som regel feil om hvor det lønner seg å optimalisere koden (!), eller hvordan optimalisere for ytelse i dette tilfellet.

 

Jeg ville heller godtatt noen flere spørringer mot database, og senere begynt å cache mest mulig for anonyme brukere og annet som er felles for alle besøkende. Har du ett ytelsesproblem med innloggede brukere (hvor det er naturlig å bruke sessions/cookies for å kjenne igjen bruker og lign.), ville jeg også vurdert designet først og så sett på sessions som ett av alternativene.

Mulig jeg har hengt meg litt for mye opp i å ikke ha for mange queryies :p Men å hente samme data flere ganger virker ganske unødvendig. Mye vil vel løse seg med sånn memcache greier? Akkurat nå kan jeg ingenting om det..

 

 

 

Ett lite spørsmål:

$obj = & new Object($param);

Hva er egentlig poenget med referanse der? Skjønner viss det er "$obj = & $someObject" for da er det en direkte referanse, men referanse til "new" skjønner jeg ikke helt

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