Ga naar inhoud

[PHP] OOP objecten en sessies...


Aanbevolen berichten

Hoi, ik heb de volgende opzet die ik wil realiseren: ik ben een winkelapplicatie aan het maken. Het moet mogelijk zijn om meerdere artikelen toe te voegen aan het winkelwagentje. Dit wil ik op de volgende manier doen: Ik maak een dataklasse Artikel met de nodige getters en setters. Ik heb een sessievariabele artikelen waarin ik een array met artikelen zet. De artikelen in de array zijn instanties van de klasse artikel. Deze bewaar ik dus in mijn sessie variabele. Deze array wordt goed doorgegeven in de sessievariabele. Ik zet dus de array uit de sessie variabele in een lokale variabele, ook dit gaat goed, ik heb dit gechecked met print_r en ik zie de juiste info terug. Het probleem is dat als ik mijn object (de instantie van de artikel klasse) in een lokale variabele zet en een methode hiervan aanroep, dat de parser dit niet zo fijn vind. ik krijg de volgende foutmelding: [i:70ef2aef98]Fatal error: Unknown(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>artikel</b> of the object you are trying to operate on was loaded _before_ the session was started in F:\WEBDESIGN\Projecten\zitten\bestellen_1.php on line 8[/i:70ef2aef98] Ik ben er even aan verdergegaan en ik heb geprobeerd het object uit te lezen middels print_r en kreeg het volgende resultaat: [i:70ef2aef98]__PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => artikel [naam] => Remco [prijs] => [bekleding] => ) [/i:70ef2aef98] Maar het wordt er niet duidelijker op... Ik snap dat er iets mis is met het object dat ik wil aanspreken, maar wat er voor de rest staat.... Ik hoop dat iemand anders mij hiermee kan helpen. alvast bedankt!!
Link naar reactie
Het bleek dat als je de sessie var (het object) wilt hergebruiken in een andere pagina, dat je eerst de klasse moet includen (had ik gedaan) en daarna nog een keer session_start() moet aanroepen. Dit omdat anders je object unserialized werd en dan heb je er dus niets meer aan. Het is helaas niet opgelost hiermee... Het bovenstaande werkt alleen maar als je echt naar een andere pagina gaat en niet als (zoals ik) andere pagina's in een div include... Iemand die hier een oplossing op weet?
Link naar reactie
Je kan de SESSION-array als een opslag plek zien, zoals een database. Je slaat de data van de artikelen op in de SESSION en bij de volgende request bouw je de artikelen opnieuw op mbv de data (dus geen objecten opslaan, maar data). Het makkelijkst om dit toe te passen, is door nog een object te creeeren: ShoppingBasket (winkelmandje). ShoppingBasket verzorgt het opslaan en ophalen uit je SESSION (en kan meer dingen doen zoals totaal berekenen, artikelen toevoegen/verwijderen, bestelling definitief maken, etc...). even een snel voorbeeldje: [code:1:27fecf8c12]$basket =& new ShoppingBasket(); $article1 =& new Article(5432); $article2 =& new Article(5435); $basket->addArticle($article1); $basket->addArticle($article2); //volgende request: $basket =& new ShoppingBasket(); $articles =& $basket->getArticles(); $total = $basket->getTotal(); $btw = $basket->getVAT(); etc...[/code:1:27fecf8c12] Hopelijk heb ik je hiermee een duwtje in de 'goede' richting gegeven. -Rémy
Link naar reactie
Bedankt voor je antwoord. Dit is alleen geen oplossing van het probleem, ik ben bekend met de wijze van programmeren OOP (heb nogal wat ervaring in JAVA). Het probleem was als volgt: bij het verwisselen van pagina (of dit nu via een link gaat of via include dat maakt even niet uit) ging er iets fout: ik kreeg een php incomplete object error. Deze werd gegenereerd vanwege het feit dat als je in een sessie classobjects opslaat deze werden geserialiseerd bij een paginawissel. Dit komt omdat als er gewisseld wordt van pagina worden de sessie objecten gedeserialiseerd, dit gebeurde zonder de bijbehorende methoden. Dit veroorzaakte de error, de oplossing was vrij simpel, ik gebruik include in index.php, nu moet ik eerst boven mijn session_start() de klassen die ik gebruik (artikelen) includen dan krijg ik deze error niet meer. Zoals je ziet is het opgelost, iig bedankt voor je aand8
Link naar reactie
[quote:5c5d3e2b2a="B00TjE"]Zoals je ziet is het opgelost...[/quote:5c5d3e2b2a]??? En eerst zeg je dat je probleem nog niet opgelost is :-? Je zegt dat je probleem begon met dat je objecten niet goed uit je SESSION komen. Je hebt zelf hieral het antwoord op gevonden: de class waarop het object is gebaseerd moet je voor session_start() zetten\definieren. (Hier had ik je ook voor [url=http://forum.computertotaal.nl/phpBB2/viewtopic.php?p=763008&highlight=#763008]gewaarschuwd[/url] ;).) Vervolgens zeg je zelf: [quote:5c5d3e2b2a="B00TjE"]Het is helaas niet opgelost hiermee...[/quote:5c5d3e2b2a] Jouw probleem is dan (zoals ik het lees): Je kan de class, vanwege pagina's die je include ofzo, niet voor session_start() zetten. Vervolgens geef ik je een mogelijke oplossing voor dit probleem: [b:5c5d3e2b2a]"geen objecten opslaan, maar data"[/b:5c5d3e2b2a] en dat je dit het beste kan laten afhandelen door een nieuwe object te maken, een ShoppingBasket. Je laat dan het '(un)serializen' over aan ShoppingBasket ipv de SESSION, door geen objecten op te slaan, maar een string of een array (zonder objecten). [quote:5c5d3e2b2a="B00TjE"]Dit is alleen geen oplossing van het probleem[/quote:5c5d3e2b2a]Dit is wel degelijk een mogelijke oplossing voor je probleem! [quote:5c5d3e2b2a="B00TjE"]ik ben bekend met de wijze van programmeren OOP[/quote:5c5d3e2b2a]Ja, en? Als ik een voorbeeldje geef van hoe ik de API zou doen, betekend niet dat je ik probeer uit te leggen hoe je OO moet programmeren. -Rémy
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...