login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Object serialization

Offline cloudstrife - 07/01/2008 16:16
Avatar van cloudstrifePHP beginner Ik ben bezig aan een script volgens het mvc pattern. In mijn index.php begin ik met session_start() en ga ik daarna de juiste controller en event etc inladen. Probleem is nu dat ik instanties van objecten in een sessie variabele stop en dit geeft blijkbaar problemen. Je moet eerst je bestanden van je classes includen voor je de session_start() doet.

Hoe kan ik dit nu het beste oplossen?

In elke controller session_start() gaan zetten werkt maar is volgens mij ni netjes.
En in de index.php alle bestanden includen voor de session_start() lijkt me zeker niet netjes.

8 antwoorden

Gesponsorde links
Offline Stijn - 07/01/2008 16:35
Avatar van Stijn PHP expert Als je controller goed werkt moet je in je index.php enkel classes includen die je nodig hebt en ook maar 1 keer je sessie starten. De controller (dispatcher) werkt bijna zoals een paginasysteem. Het zal aan de hand van de controller en action de juiste controller->action(); oproepen.

Als je objecten wilt opslaan moet je inderdaad PHP.net: serialize gebruiken en er moet een __sleep()/__wakeup() functie zijn in de class. Het is best dat je eerst session_start(); doet en dan included, maar omgekeerd is ook niet verkeerd.
Offline cloudstrife - 07/01/2008 16:43
Avatar van cloudstrife PHP beginner
stijn1989 schreef:
Als je controller goed werkt moet je in je index.php enkel classes includen die je nodig hebt en ook maar 1 keer je sessie starten. De controller (dispatcher) werkt bijna zoals een paginasysteem. Het zal aan de hand van de controller en action de juiste controller->action(); oproepen.

Als je objecten wilt opslaan moet je inderdaad PHP.net: serialize gebruiken en er moet een __sleep()/__wakeup() functie zijn in de class. Het is best dat je eerst session_start(); doet en dan included, maar omgekeerd is ook niet verkeerd.


MIjn index.php is idd zo opgebouwd dat hij 1 controller en 1 event per keer uitvoerd zoals je hier zegt. Ik heb die link van jou naar php.net eens bekeken en daar staat dat dit bij sessies automatisch gebeurt + de volgende tekst:

Citaat:
If you are using sessions and use session_register() to register objects, these objects are serialized automatically at the end of each PHP page, and are unserialized automatically on each of the following pages. This basically means that these objects can show up on any of your pages once they become part of your session.

It is strongly recommended that you include the class definitions of all such registered objects on all of your pages, even if you do not actually use these classes on all of your pages. If you don't and an object is being unserialized without its class definition being present, it will lose its class association and become an object of class stdClass without any functions available at all, that is, it will become quite useless.

So if in the example above $a became part of a session by running session_register("a"), you should include the file classa.inc on all of your pages, not only page1.php and page2.php.


Dus is mijn probleem hiermee niet echt opgelost, want om goed te zijn zou de session_start() enkel in de index.php mogen gebeuren ipv in elke controller en volgens die tekst van php.net moet ik dan alle bestanden gaan includen die in een sessie kunnen zitten.
Offline marten - 07/01/2008 16:48
Avatar van marten Beheerder Je kan objecten niet in een sessie zetten. Dit moet je eerst serializen. Dit kan je overigens afvangen door een register in te bouwen. Zie verder mijn tutorial over het mvc. Daar komt ook het register in terug.
Offline cloudstrife - 07/01/2008 16:54
Avatar van cloudstrife PHP beginner
marten schreef:
Je kan objecten niet in een sessie zetten. Dit moet je eerst serializen. Dit kan je overigens afvangen door een register in te bouwen. Zie verder mijn tutorial over het mvc. Daar komt ook het register in terug.

Er staat toch dat dit serializen automatisch gebeurt... Het werkt overigens wel om objecten in een sessie te duwen, daar ligt het probleem niet echt. Als ik in elke controller session_start() gebruik gaat dit perfect, alleen lijkt me dit niet echt een goede manier en hoort die session_start() thuis in de index.
Offline Stijn - 07/01/2008 17:28
Avatar van Stijn PHP expert
Citaat:
Je kan objecten niet in een sessie zetten. Dit moet je eerst serializen.
Ik heb het eens getest en je moet dit niet doen.

Wat je ook kan doen is je objecten opslaan in je (front) controller. En dan kan je dat object oproepen in je controller. Een voorbeeld.

  1. //index.php
  2. ...
  3. $db = new DB(...);
  4. ...
  5. $controller->setObject( 'db' , $db );
  6. $controller->dispatch();
  7. ?>


setObject( Label $label , Object $obj ) zal dan het object in een array zetten.

  1. //controller.class.php
  2. class Controller {
  3. ...
  4. protected $_objects = array();
  5. ...
  6. public function setObject( $label , $obj )
  7. {
  8. $this->_objects[$label] = $obj;
  9. }
  10. ...


In je controller dan.

  1. <?php
  2. class IndexController extends Controller
  3. {
  4.  
  5. public function indexEvent()
  6. {
  7. $record = $this->_objects['db']->fetchRow(...);
  8. }
  9.  
  10. ...
  11.  
  12. }
Offline cloudstrife - 07/01/2008 17:30
Avatar van cloudstrife PHP beginner Idd has ik ook al aangedacht, misschien wel de beste optie.
Offline marten - 07/01/2008 21:39
Avatar van marten Beheerder Oftewel lees en lees dan ook dat dit een register oplossing is waar ik het over had 
Offline ikkedikke - 08/01/2008 10:44
Avatar van ikkedikke PHP expert er bestaat ook nog zoiets als een autoload-functie
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.387s